12c7b1c5 (kx 2023-03-24 02:53:04 +0300 1)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 2) #ifdef HAVE_CONFIG_H
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 3) #include <config.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 4) #endif
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 5)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 6) #include <stdlib.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 7) #include <stdio.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 8) #include <unistd.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 9) #include <string.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 10) #include <stdarg.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 11) #include <limits.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 12) #include <locale.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 13) #include <wchar.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 14) #include <wctype.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 15)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 16) #define PCRE2_CODE_UNIT_WIDTH 32
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 17) #include <pcre2.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 18)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 19) #include <defs.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 20)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 21) #include <main.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 22) #include <error.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 23) #include <msglog.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 24) #include <xalloc.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 25) #include <utf8ing.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 26) #include <symtab.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 27) #include <parse.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 28)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 29) #include <lex.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 30)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 31)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 32)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 33) int lineno = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 34) int colno = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 35)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 36) static int maxtoken;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 37) static wchar_t *token_buffer;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 38)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 39) static int max8token;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 40) static utf8_t *token_utf8_buffer;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 41)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 42) int indent_level = 0; /* Number of '{' minus number of '}'. */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 43)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 44) static int end_of_file = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 45) static int nextchar = -1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 46)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 47) static char *locale;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 48)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 49) #define GETC(c) ({ wint_t ret; ++colno; ret = fgetwc( config ); ret; })
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 50) #define UNGETC(c) ({ wint_t ret; --colno; ret = ungetwc( c, config ); ret; })
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 51)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 52)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 53) static wchar_t *extend_token_buffer( wchar_t *p )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 54) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 55) int offset = p - token_buffer;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 56) maxtoken = maxtoken * 2 + 10;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 57) token_buffer = (wchar_t *)xrealloc( token_buffer, (maxtoken + 2)*sizeof(wchar_t) );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 58)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 59) return( token_buffer + offset );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 60) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 61)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 62) static utf8_t *extend_token_utf8_buffer( utf8_t *p )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 63) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 64) int offset = p - token_utf8_buffer;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 65) max8token = max8token * 2 + 10;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 66) token_utf8_buffer = (utf8_t *)xrealloc( token_utf8_buffer, (max8token + 2)*6 );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 67)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 68) return( token_utf8_buffer + offset );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 69) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 70)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 71)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 72) void yyerror( char const *s )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 73) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 74) error( "%s", s );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 75) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 76)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 77)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 78) void init_lex( void )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 79) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 80) locale = setlocale( LC_ALL, "en_US.utf8" );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 81)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 82) lineno = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 83) colno = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 84)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 85) nextchar = -1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 86) maxtoken = 40;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 87) max8token = 40;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 88)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 89) indent_level = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 90) end_of_file = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 91)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 92) token_buffer = (wchar_t *)xmalloc( maxtoken * sizeof(wchar_t) + 2 );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 93) token_utf8_buffer = (utf8_t *)xmalloc( max8token * 6 + 2 );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 94) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 95)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 96) void fini_lex( void )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 97) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 98) locale = setlocale( LC_ALL, locale );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 99)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 100) if( token_buffer ) { free( token_buffer ); token_buffer = NULL; }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 101) if( token_utf8_buffer ) { free( token_utf8_buffer ); token_utf8_buffer = NULL; }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 102)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 103) indent_level = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 104) end_of_file = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 105)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 106) max8token = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 107) maxtoken = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 108) nextchar = -1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 109)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 110) lineno = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 111) colno = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 112) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 113)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 114) static wint_t check_newline( void )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 115) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 116) wint_t c;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 117)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 118) ++lineno;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 119) colno = 0; /* считает GETC()/UNGETC(); здесь надо только обнулить */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 120)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 121) /*****************************************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 122) Read first nonwhite char on the line.
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 123) *****************************************/
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 124) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 125) while( c == ' ' || c == '\t' ) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 126)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 127) if( c == '#' ) goto skipline;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 128) else return( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 129)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 130) /* skip the rest of this line */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 131) skipline:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 132)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 133) while( c != '\n' && c != WEOF )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 134) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 135)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 136) return( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 137) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 138)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 139) static wint_t skip_comment( int c )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 140) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 141) if( c == '*' )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 142) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 143) do1:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 144) do
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 145) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 146) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 147) if( c == '\n' ) { ++lineno; colno = 0; }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 148)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 149) } while( c != '*' && c != WEOF );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 150)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 151) if( c == WEOF )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 152) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 153) unterminated_comment();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 154) return( WEOF );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 155) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 156)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 157) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 158)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 159) if( c == '/' )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 160) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 161) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 162) if( c == '\n' ) c = check_newline();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 163) return( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 164) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 165) else
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 166) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 167) UNGETC( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 168) goto do1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 169) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 170) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 171) else if( c == '/' || c == '#' )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 172) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 173) do
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 174) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 175) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 176)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 177) } while( c != '\n' && c != WEOF );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 178)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 179) if( c == WEOF )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 180) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 181) unterminated_comment();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 182) return( WEOF );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 183) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 184) else c = check_newline();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 185)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 186) return( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 187) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 188)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 189) return( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 190)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 191) } /* End skip_commemnt() */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 192)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 193) static wint_t skip_white_space( wint_t c )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 194) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 195) for( ;; )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 196) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 197) switch( c )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 198) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 199) case '\n':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 200) c = check_newline();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 201) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 202)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 203) case '#':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 204) c = skip_comment( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 205) return( skip_white_space( c ) );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 206) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 207)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 208) case '/':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 209) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 210) if( c == '/' || c == '*' )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 211) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 212) c = skip_comment( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 213) return( skip_white_space( c ) );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 214) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 215) else
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 216) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 217) UNGETC( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 218) return( '/' );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 219) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 220) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 221)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 222) case ' ':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 223) case '\t':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 224) case '\f':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 225) case '\v':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 226) case '\b':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 227) case '\r':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 228) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 229) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 230) case '\\':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 231) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 232) if( c == '\n' ) { ++lineno; colno = 0; }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 233) else
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 234) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 235) warning( "%s", "Stray '\\' in program" );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 236) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 237) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 238) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 239) default:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 240) return( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 241)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 242) } /* End switch( c ) */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 243)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 244) } /* End for( ;; ) */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 245)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 246) } /* End skip_white_space() */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 247)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 248) static wint_t readescape( int *ignore_ptr )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 249) /*
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 250) read escape sequence, returning a char, or store 1 in *ignore_ptr
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 251) if it is backslash-newline
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 252) */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 253) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 254) wint_t c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 255) wint_t code;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 256) unsigned count;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 257) unsigned firstdig = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 258) int nonull;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 259)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 260) switch( c )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 261) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 262) case 'x':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 263) code = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 264) count = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 265) nonull = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 266) while( 1 )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 267) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 268) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 269) if( !(c >= 'a' && c <= 'f') &&
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 270) !(c >= 'A' && c <= 'F') &&
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 271) !(c >= '0' && c <= '9') )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 272) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 273) UNGETC( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 274) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 275) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 276) code *= 16;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 277) if( c >= 'a' && c <= 'f' ) code += c - 'a' + 10;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 278) if( c >= 'A' && c <= 'F' ) code += c - 'A' + 10;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 279) if( c >= '0' && c <= '9' ) code += c - '0';
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 280) if( code != 0 || count != 0 )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 281) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 282) if( count == 0 ) firstdig = code;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 283) count++;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 284) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 285) nonull = 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 286)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 287) } /* End while( 1 ) */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 288)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 289) if( !nonull )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 290) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 291) error( "%s", "\\x used with no following hex digits" );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 292) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 293) else if( count == 0 )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 294) /* Digits are all 0's. Ok. */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 295) ;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 296) else if( (count - 1) * 4 >= 32 || /* 32 == bits per INT */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 297) (count > 1 && ((1 << (32 - (count-1) * 4)) <= firstdig )))
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 298) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 299) warning( "%s", "Hex escape out of range" );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 300) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 301) return( code );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 302)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 303) case '0': case '1': case '2': case '3': case '4':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 304) case '5': case '6': case '7':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 305) code = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 306) count = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 307) while( (c <= '7') && (c >= '0') && (count++ < 6) )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 308) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 309) code = (code * 8) + (c - '0');
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 310) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 311) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 312) UNGETC( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 313) return( code );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 314)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 315) case '\\': case '\'': case '"':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 316) return( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 317)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 318) case '\n':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 319) lineno++; colno = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 320) *ignore_ptr = 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 321) return( 0 );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 322)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 323) case 'n':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 324) return( '\n' );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 325)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 326) case 't':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 327) return( '\t' );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 328)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 329) case 'r':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 330) return( '\r' );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 331)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 332) case 'f':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 333) return( '\f' );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 334)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 335) case 'b':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 336) return( '\b' );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 337)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 338) case 'a':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 339) return( '\a' );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 340)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 341) case 'v':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 342) return( '\v' );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 343) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 344)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 345) return( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 346)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 347) } /* End of readescape() */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 348)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 349)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 350) int html_symbol_name( wchar_t *str )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 351) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 352) int rc = 0, error = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 353) PCRE2_SIZE offset = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 354) wchar_t pattern[] = L"^(&[#A-Za-z0-9]*;)";
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 355)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 356) pcre2_match_data *match;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 357)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 358) pcre2_code *regexp = pcre2_compile( (PCRE2_SPTR)pattern, PCRE2_ZERO_TERMINATED, 0, &error, &offset, NULL );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 359) if( regexp == NULL )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 360) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 361) return 0; /* PCRE compilation failed */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 362) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 363)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 364) match = pcre2_match_data_create_from_pattern( regexp, NULL );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 365)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 366) rc = pcre2_match( regexp, (PCRE2_SPTR)str, (int)wcslen(str), 0, 0, match, NULL );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 367) if( rc < 0 )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 368) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 369) /* not match */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 370) pcre2_match_data_free( match );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 371) pcre2_code_free( regexp );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 372) return 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 373) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 374) else
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 375) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 376) /* match */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 377) pcre2_match_data_free( match );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 378) pcre2_code_free( regexp );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 379) return 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 380) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 381) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 382)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 383)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 384) int yylex( void )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 385) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 386) wint_t c;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 387) wchar_t *p;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 388) int value;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 389)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 390) if( nextchar >= 0 )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 391) c = nextchar, nextchar = -1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 392) else
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 393) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 394)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 395) while( 1 )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 396) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 397) switch( c )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 398) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 399) case ' ':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 400) case '\t':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 401) case '\f':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 402) case '\v':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 403) case '\b':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 404) c = skip_white_space( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 405) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 406)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 407) case '\r':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 408) case '\n':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 409) case '/':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 410) case '#':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 411) case '\\':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 412) c = skip_white_space( c );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 413)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 414) default:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 415) goto found_nonwhite;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 416)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 417) } /* End switch( c ) */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 418) found_nonwhite:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 419)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 420) token_buffer[0] = c;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 421) token_buffer[1] = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 422)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 423) switch( c )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 424) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 425) case WEOF:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 426) end_of_file = 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 427) token_buffer[0] = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 428) value = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 429) goto done;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 430) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 431)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 432) case '$': /* dollar in identifier */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 433) if( 1 ) goto letter;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 434) return '$';
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 435)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 436) case 'A': case 'B': case 'C': case 'D': case 'E':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 437) case 'F': case 'G': case 'H': case 'I': case 'J':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 438) case 'K': case 'L': case 'M': case 'N': case 'O':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 439) case 'P': case 'Q': case 'R': case 'S': case 'T':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 440) case 'U': case 'V': case 'W': case 'X': case 'Y':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 441) case 'Z':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 442) case 'a': case 'b': case 'c': case 'd': case 'e':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 443) case 'f': case 'g': case 'h': case 'i': case 'j':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 444) case 'k': case 'l': case 'm': case 'n': case 'o':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 445) case 'p': case 'q': case 'r': case 's': case 't':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 446) case 'u': case 'v': case 'w': case 'x': case 'y':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 447) case 'z':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 448) case '_':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 449)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 450) /* RUSSIAN */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 451) case L'А': case L'Б': case L'В': case L'Г': case L'Д':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 452) case L'Е': case L'Ё': case L'Ж': case L'З': case L'И':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 453) case L'Й': case L'К': case L'Л': case L'М': case L'Н':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 454) case L'О': case L'П': case L'Р': case L'С': case L'Т':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 455) case L'У': case L'Ф': case L'Х': case L'Ц': case L'Ч':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 456) case L'Ш': case L'Щ': case L'Ъ': case L'Ы': case L'Ь':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 457) case L'Э': case L'Ю': case L'Я':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 458)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 459) case L'а': case L'б': case L'в': case L'г': case L'д':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 460) case L'е': case L'ё': case L'ж': case L'з': case L'и':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 461) case L'й': case L'к': case L'л': case L'м': case L'н':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 462) case L'о': case L'п': case L'р': case L'с': case L'т':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 463) case L'у': case L'ф': case L'х': case L'ц': case L'ч':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 464) case L'ш': case L'щ': case L'ъ': case L'ы': case L'ь':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 465) case L'э': case L'ю': case L'я':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 466)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 467) letter:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 468) p = token_buffer;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 469) while( iswalnum( c ) || c == '_' || c == '$' || c == '@' || c == '-' || c == '.' || c == ':' )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 470) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 471) if( p >= token_buffer + maxtoken )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 472) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 473) p = extend_token_buffer( p );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 474) extend_token_utf8_buffer( token_utf8_buffer );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 475) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 476)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 477) *p++ = c;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 478) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 479) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 480) *p = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 481) nextchar = c;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 482) value = VARIABLE;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 483)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 484) (void)copy_ucs4_to_utf8( (utf8_t *)token_utf8_buffer, (const ucs4_t *)token_buffer );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 485)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 486) /*********************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 487) install into symtab
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 488) *********************/
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 489) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 490) if( !strcmp( "section", (const char *)token_utf8_buffer ) )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 491) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 492) value = SECTION;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 493) yylval.sym = install( NULL, SECTION, NULL );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 494) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 495) else if( !strcmp( "repo", (const char *)token_utf8_buffer ) )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 496) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 497) value = REPO;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 498) yylval.sym = install( NULL, REPO, NULL );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 499) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 500) else
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 501) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 502) SYMBOL *sp = NULL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 503)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 504) if( (sp = lookup( (const char *)token_utf8_buffer )) == (SYMBOL *)0 )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 505) sp = install( (const char *)token_utf8_buffer, VARIABLE, 0 );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 506)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 507) /******************************************************************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 508) Если переменная уже в таблице, то мы предполагаем, что она имеет
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 509) тип равный одному из допустимых: NUMERICAL, STRING, или PATH.
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 510) ******************************************************************/
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 511) if( sp->type != VARIABLE )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 512) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 513) switch( sp->type )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 514) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 515) case NUMERICAL:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 516) case STRING:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 517) case PATH:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 518) value = sp->type;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 519) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 520) default:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 521) /* error */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 522) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 523) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 524) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 525) yylval.sym = sp;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 526) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 527) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 528)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 529) token_buffer[0] = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 530) token_utf8_buffer[0] = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 531) goto done;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 532) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 533)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 534) case '0': case '1': case '2': case '3': case '4':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 535) case '5': case '6': case '7': case '8': case '9':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 536) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 537) int constant = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 538) /* integer: */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 539) p = token_buffer;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 540) while( iswdigit( c ) )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 541) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 542) if( p >= token_buffer + maxtoken )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 543) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 544) p = extend_token_buffer( p );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 545) extend_token_utf8_buffer( token_utf8_buffer );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 546) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 547)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 548) *p++ = c;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 549) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 550) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 551) *p = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 552) nextchar = c;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 553) value = NUMERICAL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 554)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 555) (void)copy_ucs4_to_utf8( (utf8_t *)token_utf8_buffer, (const ucs4_t *)token_buffer );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 556)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 557) /*********************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 558) install into symtab
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 559) *********************/
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 560) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 561) (void)swscanf( (const wchar_t *)token_buffer, L"%d", &constant );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 562) yylval.sym = install( NULL, NUMERICAL, constant );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 563) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 564)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 565) token_buffer[0] = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 566) token_utf8_buffer[0] = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 567) goto done;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 568) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 569) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 570)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 571) case '\'':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 572) /* path_constant: */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 573) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 574) int num_chars = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 575) unsigned int width = 8; /* to allow non asscii in path set width = 16 */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 576)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 577) while( 1 )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 578) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 579) tryagain:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 580) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 581)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 582) if( c == '\'' || c == WEOF ) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 583) if( c == '\\' )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 584) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 585) int ignore = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 586) c = readescape( &ignore );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 587) if( ignore ) goto tryagain;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 588) if( (unsigned)c >= (1 << width) )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 589) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 590) warning( "%s", "Escape sequence out of range" );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 591) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 592) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 593) else if( c == '\n' ) { lineno++; colno = 0; }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 594)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 595) num_chars++;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 596) if( num_chars > maxtoken - 4 )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 597) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 598) extend_token_buffer( token_buffer );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 599) extend_token_utf8_buffer( token_utf8_buffer );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 600) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 601)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 602) token_buffer[num_chars] = c;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 603)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 604) } /* End while( 1 ) */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 605)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 606) token_buffer[num_chars + 1] = '\'';
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 607) token_buffer[num_chars + 2] = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 608)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 609) if( c != '\'' )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 610) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 611) error( "%s", "Malformated path constant" );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 612) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 613) else if( num_chars == 0 )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 614) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 615) error( "%s", "Empty path constant" );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 616) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 617)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 618) /* build path: */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 619) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 620) wchar_t *s, *string = NULL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 621) wchar_t *p = &token_buffer[0];
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 622)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 623) while( *p )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 624) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 625) if( *p == '\n' || *p == '\t' ) *p = ' ';
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 626) ++p;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 627) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 628)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 629) string = (wchar_t *)malloc( maxtoken * 4 + 10 );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 630)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 631) p = &token_buffer[1];
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 632) s = &string[0];
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 633)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 634) while( *p == ' ' ) ++p;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 635)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 636) while( *p )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 637) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 638) if( *p != ' ' )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 639) *s++ = *p++;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 640) else
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 641) ++p;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 642) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 643) --s; *s = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 644) while( *(s-1) == ' ' ) --s;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 645) *s = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 646)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 647) (void)copy_ucs4_to_utf8( (utf8_t *)token_utf8_buffer, (const ucs4_t *)string );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 648)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 649) free( string );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 650) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 651)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 652) /*********************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 653) install into symtab
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 654) *********************/
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 655) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 656) yylval.sym = install( NULL, PATH, (char *)token_utf8_buffer );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 657) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 658)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 659) token_buffer[0] = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 660) token_utf8_buffer[0] = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 661) value = PATH;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 662) goto done;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 663) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 664)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 665) case '"':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 666) /* string_constant: */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 667) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 668) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 669) p = token_buffer + 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 670)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 671) while( c != '"' && c >= 0 )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 672) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 673) if( c == '\\' )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 674) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 675) int ignore = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 676) c = readescape( &ignore );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 677) if( ignore ) goto skipnewline;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 678) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 679) else if( c == '\n' ) lineno++;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 680)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 681) if( p == token_buffer + maxtoken )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 682) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 683) p = extend_token_buffer( p );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 684) extend_token_utf8_buffer( token_utf8_buffer );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 685) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 686) *p++ = c;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 687)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 688) skipnewline:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 689) c = GETC();
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 690)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 691) } /* End while( " ) */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 692)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 693) *p = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 694)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 695) if( c < 0 )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 696) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 697) error( "%s", "Unterminated string constant" );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 698) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 699)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 700)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 701) *p++ = '"';
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 702) *p = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 703)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 704) /* build string: */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 705) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 706) wchar_t *s, *string = NULL;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 707) wchar_t *p = &token_buffer[0];
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 708)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 709) while( *p )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 710) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 711) if( *p == '\n' || *p == '\t' ) *p = ' ';
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 712) ++p;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 713) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 714)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 715) string = (wchar_t *)malloc( maxtoken * 4 + 10 );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 716)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 717) p = &token_buffer[1];
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 718) s = &string[0];
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 719)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 720) while( *p == ' ' ) ++p;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 721)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 722) while( *p )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 723) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 724) if( *p != ' ' )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 725) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 726) switch( *p )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 727) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 728) case '&':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 729) /************************************************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 730) Skip HTML symbol names such as  ,... etc.:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 731) */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 732) if( ! html_symbol_name( p ) )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 733) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 734) *s++ = '&'; *s++ = 'a'; *s++ = 'm'; *s++ = 'p'; *s++ = ';'; ++p;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 735) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 736) else
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 737) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 738) *s++ = *p++;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 739) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 740) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 741)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 742) case '<':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 743) *s++ = '&'; *s++ = 'l'; *s++ = 't'; *s++ = ';'; ++p;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 744) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 745)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 746) case '>':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 747) *s++ = '&'; *s++ = 'g'; *s++ = 't'; *s++ = ';'; ++p;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 748) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 749)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 750) default:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 751) *s++ = *p++;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 752) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 753) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 754) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 755) else
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 756) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 757) /* skip multiple spaces */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 758) if( *(p+1) != ' ' )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 759) *s++ = *p++;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 760) else
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 761) ++p;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 762) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 763) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 764) --s; *s = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 765) while( *(s-1) == ' ' ) --s;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 766) *s = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 767)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 768) (void)copy_ucs4_to_utf8( (utf8_t *)token_utf8_buffer, (const ucs4_t *)string );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 769)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 770) free( string );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 771) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 772)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 773) /*********************
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 774) install into symtab
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 775) *********************/
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 776) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 777) yylval.sym = install( NULL, STRING, (char *)token_utf8_buffer );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 778) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 779)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 780) token_buffer[0] = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 781) token_utf8_buffer[0] = 0;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 782) value = STRING;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 783) goto done;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 784) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 785)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 786) case 0:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 787) value = 1;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 788) goto done;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 789) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 790)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 791) case '{':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 792) indent_level++;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 793) value = c;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 794) goto done;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 795) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 796)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 797) case '}':
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 798) indent_level--;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 799) value = c;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 800) goto done;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 801) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 802)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 803) default:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 804) value = c;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 805) goto done;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 806) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 807)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 808) } /* End switch( c ) */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 809)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 810) } /* End while( 1 ) */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 811)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 812) done:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 813)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 814) return( value );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 815) }