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)
|
IF(WIN32)
|
||||||
LIST(APPEND FREEGLUT_SRCS
|
LIST(APPEND FREEGLUT_SRCS
|
||||||
|
src/Common/xparsegeometry_repl.c
|
||||||
|
src/Common/xparsegeometry_repl.h
|
||||||
src/mswin/freeglut_cursor_mswin.c
|
src/mswin/freeglut_cursor_mswin.c
|
||||||
src/mswin/freeglut_display_mswin.c
|
src/mswin/freeglut_display_mswin.c
|
||||||
src/mswin/freeglut_ext_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)
|
OPTION(BUILD_STATIC_LIBS "Build FreeGLUT static library." ON)
|
||||||
|
|
||||||
FIND_PACKAGE(OpenGL REQUIRED)
|
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 ${OPENGL_gl_LIBRARY})
|
||||||
LIST(APPEND LIBS m)
|
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.
|
# 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.
|
# 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)
|
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)
|
ADD_DEFINITIONS(-DHAVE_CONFIG_H)
|
||||||
|
|
||||||
# by default, at least on UNIX, we want to build both
|
# 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
|
if TARGET_HOST_MS_WINDOWS
|
||||||
lib@LIBRARY@_la_SOURCES += \
|
lib@LIBRARY@_la_SOURCES += \
|
||||||
|
Common/xparsegeometry_repl.c \
|
||||||
|
Common/xparsegeometry_repl.h \
|
||||||
mswin/freeglut_cursor_mswin.c \
|
mswin/freeglut_cursor_mswin.c \
|
||||||
mswin/freeglut_display_mswin.c \
|
mswin/freeglut_display_mswin.c \
|
||||||
mswin/freeglut_ext_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 -------------------------------------------------- */
|
/* -- PLATFORM-SPECIFIC INTERFACE FUNCTION -------------------------------------------------- */
|
||||||
|
|
||||||
void (__cdecl *__glutExitFunc)( int return_value ) = NULL;
|
void (__cdecl *__glutExitFunc)( int return_value ) = NULL;
|
||||||
|
Reference in New Issue
Block a user