Make XParseGeometry reusable by several ports (2)
authorSylvain Beucler <beuc@beuc.net>
Fri, 9 Mar 2012 20:48:03 +0000 (20:48 +0000)
committerSylvain Beucler <beuc@beuc.net>
Fri, 9 Mar 2012 20:48:03 +0000 (20:48 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1092 7f0cb862-5218-0410-a997-914c9d46530a

src/Common/xparsegeometry_repl.c [new file with mode: 0644]
src/Common/xparsegeometry_repl.h [new file with mode: 0644]

diff --git a/src/Common/xparsegeometry_repl.c b/src/Common/xparsegeometry_repl.c
new file mode 100644 (file)
index 0000000..5151715
--- /dev/null
@@ -0,0 +1,162 @@
+#include <stdlib.h>
+
+/*
+ * Everything down to the end of the next two functions is copied from the X sources.
+ */
+
+/*
+
+Copyright 1985, 1986, 1987,1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+*/
+
+#include "Common/xparsegeometry_repl.h"
+
+/*
+ *    XParseGeometry parses strings of the form
+ *   "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where
+ *   width, height, xoffset, and yoffset are unsigned integers.
+ *   Example:  "=80x24+300-49"
+ *   The equal sign is optional.
+ *   It returns a bitmask that indicates which of the four values
+ *   were actually found in the string.  For each value found,
+ *   the corresponding argument is updated;  for each value
+ *   not found, the corresponding argument is left unchanged.
+ */
+
+static int
+ReadInteger(char *string, char **NextString)
+{
+    register int Result = 0;
+    int Sign = 1;
+
+    if (*string == '+')
+        string++;
+    else if (*string == '-')
+    {
+        string++;
+        Sign = -1;
+    }
+    for (; (*string >= '0') && (*string <= '9'); string++)
+    {
+        Result = (Result * 10) + (*string - '0');
+    }
+    *NextString = string;
+    if (Sign >= 0)
+        return Result;
+    else
+        return -Result;
+}
+
+int XParseGeometry (
+    const char *string,
+    int *x,
+    int *y,
+    unsigned int *width,    /* RETURN */
+    unsigned int *height)    /* RETURN */
+{
+    int mask = NoValue;
+    register char *strind;
+    unsigned int tempWidth = 0, tempHeight = 0;
+    int tempX = 0, tempY = 0;
+    char *nextCharacter;
+
+    if ( (string == NULL) || (*string == '\0'))
+      return mask;
+    if (*string == '=')
+        string++;  /* ignore possible '=' at beg of geometry spec */
+
+    strind = (char *)string;
+    if (*strind != '+' && *strind != '-' && *strind != 'x') {
+        tempWidth = ReadInteger(strind, &nextCharacter);
+        if (strind == nextCharacter)
+            return 0;
+        strind = nextCharacter;
+        mask |= WidthValue;
+    }
+
+    if (*strind == 'x' || *strind == 'X') {
+        strind++;
+        tempHeight = ReadInteger(strind, &nextCharacter);
+        if (strind == nextCharacter)
+            return 0;
+        strind = nextCharacter;
+        mask |= HeightValue;
+    }
+
+    if ((*strind == '+') || (*strind == '-')) {
+        if (*strind == '-') {
+            strind++;
+            tempX = -ReadInteger(strind, &nextCharacter);
+            if (strind == nextCharacter)
+                return 0;
+            strind = nextCharacter;
+            mask |= XNegative;
+        }
+        else
+        {
+            strind++;
+            tempX = ReadInteger(strind, &nextCharacter);
+            if (strind == nextCharacter)
+                return 0;
+            strind = nextCharacter;
+        }
+        mask |= XValue;
+        if ((*strind == '+') || (*strind == '-')) {
+            if (*strind == '-') {
+                strind++;
+                tempY = -ReadInteger(strind, &nextCharacter);
+                if (strind == nextCharacter)
+                    return 0;
+                strind = nextCharacter;
+                mask |= YNegative;
+            }
+            else
+            {
+                strind++;
+                tempY = ReadInteger(strind, &nextCharacter);
+                if (strind == nextCharacter)
+                    return 0;
+                strind = nextCharacter;
+            }
+            mask |= YValue;
+        }
+    }
+
+    /* If strind isn't at the end of the string the it's an invalid
+       geometry specification. */
+
+    if (*strind != '\0') return 0;
+
+    if (mask & XValue)
+        *x = tempX;
+    if (mask & YValue)
+        *y = tempY;
+    if (mask & WidthValue)
+        *width = tempWidth;
+    if (mask & HeightValue)
+        *height = tempHeight;
+    return mask;
+}
diff --git a/src/Common/xparsegeometry_repl.h b/src/Common/xparsegeometry_repl.h
new file mode 100644 (file)
index 0000000..52c392f
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copied from the X sources.
+ */
+
+/*
+
+Copyright 1985, 1986, 1987,1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+*/
+
+#ifndef  XPARSEGEOMETRY_REPL_H
+#define  XPARSEGEOMETRY_REPL_H
+
+#define NoValue         0x0000
+#define XValue          0x0001
+#define YValue          0x0002
+#define WidthValue      0x0004
+#define HeightValue     0x0008
+#define AllValues       0x000F
+#define XNegative       0x0010
+#define YNegative       0x0020
+
+extern int XParseGeometry (
+    const char *string,
+    int *x,
+    int *y,
+    unsigned int *width,    /* RETURN */
+    unsigned int *height);    /* RETURN */
+
+#endif