From 2af3aabf0e7eb1514d39b29a6b58fcd0d4de41d1 Mon Sep 17 00:00:00 2001 From: Kaleb Keithley Date: Fri, 14 Nov 2003 15:54:54 +0000 Subject: R6.6 is the Xorg base-line --- xkbscan.c | 496 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 496 insertions(+) create mode 100644 xkbscan.c (limited to 'xkbscan.c') diff --git a/xkbscan.c b/xkbscan.c new file mode 100644 index 0000000..9cda90d --- /dev/null +++ b/xkbscan.c @@ -0,0 +1,496 @@ +/* $Xorg: xkbscan.c,v 1.3 2000/08/17 19:54:34 cpqbld Exp $ */ +/************************************************************ + Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. + + Permission to use, copy, modify, and distribute this + software and its documentation for any purpose and without + fee is hereby granted, provided that the above copyright + notice appear in all copies and that both that copyright + notice and this permission notice appear in supporting + documentation, and that the name of Silicon Graphics not be + used in advertising or publicity pertaining to distribution + of the software without specific prior written permission. + Silicon Graphics makes no representation about the suitability + of this software for any purpose. It is provided "as is" + without any express or implied warranty. + + SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON + GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL + DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH + THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ********************************************************/ + +#include +#include +#include +#include +#include + +#include "tokens.h" +#define DEBUG_VAR scanDebug +#include "utils.h" + +FILE *yyin = stdin; + +static char scanFileBuf[1024]; +char * scanFile= scanFileBuf; +int lineNum= 0; + +int scanInt; +char *scanIntStr; +int scanIntClass; + +char *scanStr = NULL; +int scanStrLine= 0; + +#define BUFSIZE 512 +static int nInBuf = 0; +static char buf[BUFSIZE]; + +#ifdef DEBUG + +extern unsigned debugFlags; + +static char * +#if NeedFunctionPrototypes +tokText(int tok) +#else +tokText(tok) + int tok; +#endif +{ +static char buf[32]; + + switch (tok) { + case END_OF_FILE: sprintf(buf, "END_OF_FILE");break; + case ERROR_TOK: sprintf(buf, "ERROR"); break; + + case XKB_KEYMAP: sprintf(buf, "XKB_KEYMAP"); break; + case XKB_KEYCODES: sprintf(buf, "XKB_KEYCODES"); break; + case XKB_TYPES: sprintf(buf, "XKB_TYPES"); break; + case XKB_SYMBOLS: sprintf(buf, "XKB_SYMBOLS"); break; + case XKB_COMPATMAP: sprintf(buf, "XKB_COMPATMAP"); break; + case XKB_GEOMETRY: sprintf(buf, "XKB_GEOMETRY"); break; + case XKB_SEMANTICS: sprintf(buf, "XKB_SEMANTICS"); break; + case XKB_LAYOUT: sprintf(buf, "XKB_LAYOUT"); break; + + case INCLUDE: sprintf(buf, "INCLUDE"); break; + case OVERRIDE: sprintf(buf, "OVERRIDE"); break; + case AUGMENT: sprintf(buf, "AUGMENT"); break; + case REPLACE: sprintf(buf, "REPLACE"); break; + case ALTERNATE: sprintf(buf, "ALTERNATE"); break; + + case VIRTUAL_MODS: sprintf(buf, "VIRTUAL_MODS"); break; + case TYPE: sprintf(buf, "TYPE"); break; + case INTERPRET: sprintf(buf, "INTERPRET"); break; + case ACTION_TOK: sprintf(buf, "ACTION"); break; + case KEY: sprintf(buf, "KEY"); break; + case ALIAS: sprintf(buf, "ALIAS"); break; + case GROUP: sprintf(buf, "GROUP"); break; + case MODIFIER_MAP: sprintf(buf, "MODIFIER_MAP"); break; + case INDICATOR: sprintf(buf, "INDICATOR"); break; + case SHAPE: sprintf(buf, "SHAPE"); break; + case KEYS: sprintf(buf, "KEYS"); break; + case ROW: sprintf(buf, "ROW"); break; + case SECTION: sprintf(buf, "SECTION"); break; + case OVERLAY: sprintf(buf, "OVERLAY"); break; + case TEXT: sprintf(buf, "TEXT"); break; + case OUTLINE: sprintf(buf, "OUTLINE"); break; + case SOLID: sprintf(buf, "SOLID"); break; + case LOGO: sprintf(buf, "LOGO"); break; + case VIRTUAL: sprintf(buf, "VIRTUAL"); break; + + case EQUALS: sprintf(buf, "EQUALS"); break; + case PLUS: sprintf(buf, "PLUS"); break; + case MINUS: sprintf(buf, "MINUS"); break; + case DIVIDE: sprintf(buf, "DIVIDE"); break; + case TIMES: sprintf(buf, "TIMES"); break; + case OBRACE: sprintf(buf, "OBRACE"); break; + case CBRACE: sprintf(buf, "CBRACE"); break; + case OPAREN: sprintf(buf, "OPAREN"); break; + case CPAREN: sprintf(buf, "CPAREN"); break; + case OBRACKET: sprintf(buf, "OBRACKET");break; + case CBRACKET: sprintf(buf, "CBRACKET");break; + case DOT: sprintf(buf, "DOT"); break; + case COMMA: sprintf(buf, "COMMA"); break; + case SEMI: sprintf(buf, "SEMI"); break; + case EXCLAM: sprintf(buf, "EXCLAM"); break; + case INVERT: sprintf(buf, "INVERT"); break; + + case STRING: sprintf(buf, "STRING (%s)",scanStr); break; + case INTEGER: sprintf(buf, "INTEGER (0x%x)",scanInt); break; + case FLOAT: sprintf(buf, "FLOAT (%d.%d)", + scanInt/XkbGeomPtsPerMM, + scanInt%XkbGeomPtsPerMM);break; + case IDENT: sprintf(buf, "IDENT (%s)",scanStr); break; + case KEYNAME: sprintf(buf, "KEYNAME (%s)",scanStr); break; + + case PARTIAL: sprintf(buf, "PARTIAL"); break; + case DEFAULT: sprintf(buf, "DEFAULT"); break; + case HIDDEN: sprintf(buf, "HIDDEN"); break; + + case ALPHANUMERIC_KEYS: sprintf(buf, "ALPHANUMERIC_KEYS"); break; + case MODIFIER_KEYS: sprintf(buf, "MODIFIER_KEYS"); break; + case KEYPAD_KEYS: sprintf(buf, "KEYPAD_KEYS"); break; + case FUNCTION_KEYS: sprintf(buf, "FUNCTION_KEYS"); break; + case ALTERNATE_GROUP: sprintf(buf, "ALTERNATE_GROUP"); break; + + default: sprintf(buf, "UNKNOWN"); break; + } + return buf; +} +#endif + +int +#if NeedFunctionPrototypes +setScanState(char *file,int line) +#else +setScanState(file,line) + char * file; + int line; +#endif +{ + if (file!=NULL) + strncpy(scanFile,file,1024); + if (line>=0) + lineNum= line; + return 1; +} + +int +#if NeedFunctionPrototypes +yyGetString(void) +#else +yyGetString() +#endif +{ +int ch; + + nInBuf = 0; + while ( ((ch=getc(yyin))!=EOF) && (ch!='"') ) { + if ( ch == '\\' ) { + if ((ch = getc(yyin))!=EOF) { + if ( ch=='n' ) ch = '\n'; + else if ( ch == 't' ) ch = '\t'; + else if ( ch == 'v' ) ch = '\v'; + else if ( ch == 'b' ) ch = '\b'; + else if ( ch == 'r' ) ch = '\r'; + else if ( ch == 'f' ) ch = '\f'; + else if ( ch == 'e' ) ch = '\033'; + else if ( ch == '0' ) { + int tmp,stop; + ch = stop = 0; + if (((tmp=getc(yyin))!=EOF) && (isdigit(tmp)) && + (tmp!='8') && (tmp!='9')) { + ch= (ch*8)+(tmp-'0'); + } + else { + stop= 1; + ungetc(tmp,yyin); + } + if ((!stop) && ((tmp=getc(yyin))!=EOF) && (isdigit(tmp)) && + (tmp!='8') && (tmp!='9')) { + ch= (ch*8)+(tmp-'0'); + } + else { + stop= 1; + ungetc(tmp,yyin); + } + if ((!stop) && ((tmp=getc(yyin))!=EOF) && (isdigit(tmp)) && + (tmp!='8') && (tmp!='9')) { + ch= (ch*8)+(tmp-'0'); + } + else { + stop= 1; + ungetc(tmp,yyin); + } + } + } + else return ERROR_TOK; + } + + if ( nInBuf < BUFSIZE-1 ) + buf[nInBuf++] = ch; + } + if ( ch == '"' ) { + buf[nInBuf++] = '\0'; + if ( scanStr ) + uFree( scanStr ); + scanStr = (char *)uStringDup(buf); + scanStrLine = lineNum; + return STRING; + } + return ERROR_TOK; +} + +int +#if NeedFunctionPrototypes +yyGetKeyName(void) +#else +yyGetKeyName() +#endif +{ +int ch; + + nInBuf = 0; + while ( ((ch=getc(yyin))!=EOF) && (ch!='>') ) { + if ( ch == '\\' ) { + if ((ch = getc(yyin))!=EOF) { + if ( ch=='n' ) ch = '\n'; + else if ( ch == 't' ) ch = '\t'; + else if ( ch == 'v' ) ch = '\v'; + else if ( ch == 'b' ) ch = '\b'; + else if ( ch == 'r' ) ch = '\r'; + else if ( ch == 'f' ) ch = '\f'; + else if ( ch == 'e' ) ch = '\033'; + else if ( ch == '0' ) { + int tmp,stop; + ch = stop = 0; + if (((tmp=getc(yyin))!=EOF) && (isdigit(tmp)) && + (tmp!='8') && (tmp!='9')) { + ch= (ch*8)+(tmp-'0'); + } + else { + stop= 1; + ungetc(tmp,yyin); + } + if ((!stop) && ((tmp=getc(yyin))!=EOF) && (isdigit(tmp)) && + (tmp!='8') && (tmp!='9')) { + ch= (ch*8)+(tmp-'0'); + } + else { + stop= 1; + ungetc(tmp,yyin); + } + if ((!stop) && ((tmp=getc(yyin))!=EOF) && (isdigit(tmp)) && + (tmp!='8') && (tmp!='9')) { + ch= (ch*8)+(tmp-'0'); + } + else { + stop= 1; + ungetc(tmp,yyin); + } + } + } + else return ERROR_TOK; + } + + if ( nInBuf < BUFSIZE-1 ) + buf[nInBuf++] = ch; + } + if (( ch == '>' )&&(nInBuf<5)) { + buf[nInBuf++] = '\0'; + if ( scanStr ) + uFree( scanStr ); + scanStr = (char *)uStringDup(buf); + scanStrLine = lineNum; + return KEYNAME; + } + return ERROR_TOK; +} + +struct _Keyword { + char *keyword; + int token; +} keywords[] = { + { "xkb_keymap", XKB_KEYMAP }, + { "xkb_keycodes", XKB_KEYCODES }, + { "xkb_types", XKB_TYPES }, + { "xkb_symbols", XKB_SYMBOLS }, + { "xkb_compat", XKB_COMPATMAP }, + { "xkb_compat_map", XKB_COMPATMAP }, + { "xkb_compatibility", XKB_COMPATMAP }, + { "xkb_compatibility_map", XKB_COMPATMAP }, + { "xkb_geometry", XKB_GEOMETRY }, + { "xkb_semantics", XKB_SEMANTICS }, + { "xkb_layout", XKB_LAYOUT }, + { "include", INCLUDE }, + { "override", OVERRIDE }, + { "augment", AUGMENT }, + { "replace", REPLACE }, + { "alternate", ALTERNATE }, + { "partial", PARTIAL }, + { "default", DEFAULT }, + { "hidden", HIDDEN }, + { "virtual_modifiers", VIRTUAL_MODS }, + { "type", TYPE }, + { "interpret", INTERPRET }, + { "action", ACTION_TOK }, + { "key", KEY }, + { "alias", ALIAS }, + { "group", GROUP }, + { "modmap", MODIFIER_MAP }, + { "mod_map", MODIFIER_MAP }, + { "modifier_map", MODIFIER_MAP }, + { "indicator", INDICATOR }, + { "shape", SHAPE }, + { "row", ROW }, + { "keys", KEYS }, + { "section", SECTION }, + { "overlay", OVERLAY }, + { "text", TEXT }, + { "outline", OUTLINE }, + { "solid", SOLID }, + { "logo", LOGO }, + { "virtual", VIRTUAL }, + { "alphanumeric_keys", ALPHANUMERIC_KEYS }, + { "modifier_keys", MODIFIER_KEYS }, + { "keypad_keys", KEYPAD_KEYS }, + { "function_keys", FUNCTION_KEYS }, + { "alternate_group", ALTERNATE_GROUP } +}; +int numKeywords = sizeof(keywords)/sizeof(struct _Keyword); + +int +#if NeedFunctionPrototypes +yyGetIdent(int first) +#else +yyGetIdent(first) + int first; +#endif +{ +int ch,i,found; +int rtrn= IDENT; + + buf[0] = first; nInBuf = 1; + while ( ((ch=getc(yyin))!=EOF) && (isalnum(ch)||(ch=='_')) ) { + if ( nInBuf < BUFSIZE - 1 ) + buf[nInBuf++] = ch; + } + buf[nInBuf++] = '\0'; + found= 0; + + for (i=0;(!found)&&(i