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:
parent
11a4f362e1
commit
426ce85a73
@ -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
|
||||
|
@ -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 \
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user