Make XParseGeometry reusable by several ports

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1091 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
beuc 2012-03-09 20:46:15 +00:00
parent 11a4f362e1
commit 426ce85a73
3 changed files with 6 additions and 140 deletions

View File

@ -37,6 +37,8 @@ SET(FREEGLUT_SRCS
IF(WIN32)
LIST(APPEND FREEGLUT_SRCS
src/Common/xparsegeometry_repl.c
src/Common/xparsegeometry_repl.h
src/mswin/freeglut_cursor_mswin.c
src/mswin/freeglut_display_mswin.c
src/mswin/freeglut_ext_mswin.c
@ -85,7 +87,7 @@ OPTION(BUILD_SHARED_LIBS "Build FreeGLUT shared library." ON)
OPTION(BUILD_STATIC_LIBS "Build FreeGLUT static library." ON)
FIND_PACKAGE(OpenGL REQUIRED)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${OPENGL_INCLUDE_DIR})
INCLUDE_DIRECTORIES(${OPENGL_INCLUDE_DIR})
LIST(APPEND LIBS ${OPENGL_gl_LIBRARY})
LIST(APPEND LIBS m)
@ -130,7 +132,7 @@ CHECK_FUNCTION_EXISTS(_doprnt HAVE_DOPRNT)
# ensure that all CMake-generated files are kept away from the main source tree.
# As a result, the build directory must to be added to the include path list.
CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/config.h.in ${CMAKE_BINARY_DIR}/config.h)
INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR})
INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src)
ADD_DEFINITIONS(-DHAVE_CONFIG_H)
# by default, at least on UNIX, we want to build both

View File

@ -41,6 +41,8 @@ lib@LIBRARY@_la_SOURCES = Common/freeglut_callbacks.c \
if TARGET_HOST_MS_WINDOWS
lib@LIBRARY@_la_SOURCES += \
Common/xparsegeometry_repl.c \
Common/xparsegeometry_repl.h \
mswin/freeglut_cursor_mswin.c \
mswin/freeglut_display_mswin.c \
mswin/freeglut_ext_mswin.c \

View File

@ -195,144 +195,6 @@ from The Open Group.
*/
#define NoValue 0x0000
#define XValue 0x0001
#define YValue 0x0002
#define WidthValue 0x0004
#define HeightValue 0x0008
#define AllValues 0x000F
#define XNegative 0x0010
#define YNegative 0x0020
/*
* 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;
}
/* -- PLATFORM-SPECIFIC INTERFACE FUNCTION -------------------------------------------------- */
void (__cdecl *__glutExitFunc)( int return_value ) = NULL;