Changeset 77 for pjproject/trunk/pjlib-util/src/pjlib-util/scanner.c
- Timestamp:
- Nov 22, 2005 11:51:50 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjlib-util/src/pjlib-util/scanner.c
r73 r77 24 24 #include <pj/assert.h> 25 25 26 #define PJ_SCAN_IS_SPACE(c) ((c)==' ' || (c)=='\t') 27 #define PJ_SCAN_IS_NEWLINE(c) ((c)=='\r' || (c)=='\n') 28 #define PJ_SCAN_CHECK_EOF(s) (s != end) 26 #define PJ_SCAN_IS_SPACE(c) ((c)==' ' || (c)=='\t') 27 #define PJ_SCAN_IS_NEWLINE(c) ((c)=='\r' || (c)=='\n') 28 #define PJ_SCAN_IS_PROBABLY_SPACE(c) ((c) <= 32) 29 #define PJ_SCAN_CHECK_EOF(s) (*s) 29 30 30 31 … … 108 109 scanner->end = bufstart + buflen; 109 110 scanner->line = 1; 110 scanner-> col = 1;111 scanner->start_line = scanner->begin; 111 112 scanner->callback = callback; 112 113 scanner->skip_ws = options; … … 114 115 if (scanner->skip_ws) 115 116 pj_scan_skip_whitespace(scanner); 116 117 scanner->col = scanner->curptr - scanner->begin + 1;118 117 } 119 118 … … 129 128 register char *s = scanner->curptr; 130 129 131 PJ_CHECK_STACK();132 133 130 while (PJ_SCAN_IS_SPACE(*s)) { 134 131 ++s; 135 132 } 136 133 137 if ( (scanner->skip_ws & PJ_SCAN_AUTOSKIP_NEWLINE) && PJ_SCAN_IS_NEWLINE(*s)) {134 if (PJ_SCAN_IS_NEWLINE(*s) && (scanner->skip_ws & PJ_SCAN_AUTOSKIP_NEWLINE)) { 138 135 for (;;) { 139 136 if (*s == '\r') { … … 141 138 if (*s == '\n') ++s; 142 139 ++scanner->line; 143 scanner->col = 1; 144 scanner->curptr = s; 140 scanner->curptr = scanner->start_line = s; 145 141 } else if (*s == '\n') { 146 142 ++s; 147 143 ++scanner->line; 148 scanner->col = 1; 149 scanner->curptr = s; 144 scanner->curptr = scanner->start_line = s; 150 145 } else if (PJ_SCAN_IS_SPACE(*s)) { 151 146 do { … … 160 155 if (PJ_SCAN_IS_NEWLINE(*s) && (scanner->skip_ws & PJ_SCAN_AUTOSKIP_WS_HEADER)==PJ_SCAN_AUTOSKIP_WS_HEADER) { 161 156 /* Check for header continuation. */ 162 scanner->col += s - scanner->curptr;163 157 scanner->curptr = s; 164 158 … … 169 163 ++s; 170 164 } 165 scanner->start_line = s; 166 171 167 if (PJ_SCAN_IS_SPACE(*s)) { 172 168 register char *t = s; … … 176 172 177 173 ++scanner->line; 178 scanner->col = t-s;179 174 scanner->curptr = t; 180 175 } 181 176 } else { 182 scanner->col += s - scanner->curptr;183 177 scanner->curptr = s; 178 } 179 } 180 181 PJ_DEF(void) pj_scan_skip_line( pj_scanner *scanner ) 182 { 183 char *s = pj_native_strchr(scanner->curptr, '\n'); 184 if (!s) { 185 scanner->curptr = scanner->end; 186 } else { 187 scanner->curptr = scanner->start_line = s+1; 188 scanner->line++; 189 if (PJ_SCAN_IS_PROBABLY_SPACE(*s) && scanner->skip_ws) { 190 pj_scan_skip_whitespace(scanner); 191 } 184 192 } 185 193 } … … 189 197 { 190 198 register char *s = scanner->curptr; 191 register char *end = scanner->end; 192 193 PJ_CHECK_STACK(); 194 195 if (pj_scan_is_eof(scanner)) { 199 200 if (s >= scanner->end) { 196 201 pj_scan_syntax_err(scanner); 197 202 return -1; 198 203 } 199 204 200 while (PJ_SCAN_CHECK_EOF(s) && pj_cis_match(spec, *s)) 201 ++s; 202 203 pj_strset3(out, scanner->curptr, s); 204 return s < scanner->end ? *s : 0; 205 /* Don't need to check EOF with PJ_SCAN_CHECK_EOF(s) */ 206 while (pj_cis_match(spec, *s)) 207 ++s; 208 209 pj_strset3(out, scanner->curptr, s); 210 return *s; 205 211 } 206 212 … … 210 216 { 211 217 char *endpos = scanner->curptr + len; 212 213 PJ_CHECK_STACK();214 218 215 219 if (endpos > scanner->end) { … … 228 232 { 229 233 register char *s = scanner->curptr; 230 register char *end = scanner->end; 231 232 PJ_CHECK_STACK(); 233 234 if (pj_scan_is_eof(scanner)) { 234 235 if (s >= scanner->end) { 235 236 pj_scan_syntax_err(scanner); 236 237 return -1; … … 241 242 242 243 pj_strset3(out, scanner->curptr, s); 243 return s!=scanner->end ? *s : 0;244 return *s; 244 245 } 245 246 … … 249 250 { 250 251 register char *s = scanner->curptr; 251 register char *end = scanner->end;252 char *start = s;253 254 PJ_CHECK_STACK();255 252 256 253 pj_assert(pj_cis_match(spec,0)==0); 257 254 258 if (pj_scan_is_eof(scanner) || !pj_cis_match(spec, *s)) { 255 /* EOF is detected implicitly */ 256 if (!pj_cis_match(spec, *s)) { 259 257 pj_scan_syntax_err(scanner); 260 258 return; … … 271 269 pj_strset3(out, scanner->curptr, s); 272 270 273 scanner->col += (s - start);274 271 scanner->curptr = s; 275 272 276 if ( scanner->skip_ws) {273 if (PJ_SCAN_IS_PROBABLY_SPACE(*s) && scanner->skip_ws) { 277 274 pj_scan_skip_whitespace(scanner); 278 275 } … … 285 282 { 286 283 register char *s = scanner->curptr; 287 register char *end = scanner->end;288 char *start = s;289 284 290 PJ_CHECK_STACK();291 292 285 /* Check and eat the begin_quote. */ 293 286 if (*s != begin_quote) { … … 301 294 do { 302 295 /* loop until end_quote is found. */ 303 do{296 while (*s && *s != '\n' && *s != end_quote) { 304 297 ++s; 305 } while (s != end && *s != '\n' && *s != end_quote);298 } 306 299 307 300 /* check that no backslash character precedes the end_quote. */ … … 319 312 /* break from main loop if we have odd number of backslashes */ 320 313 if (((unsigned)(q-r) & 0x01) == 1) { 314 ++s; 321 315 break; 322 316 } 317 ++s; 323 318 } 324 319 } else { … … 341 336 pj_strset3(out, scanner->curptr, s); 342 337 343 scanner->col += (s - start);344 338 scanner->curptr = s; 345 339 346 if ( scanner->skip_ws) {340 if (PJ_SCAN_IS_PROBABLY_SPACE(*s) && scanner->skip_ws) { 347 341 pj_scan_skip_whitespace(scanner); 348 342 } … … 350 344 351 345 PJ_DEF(void) pj_scan_get_n( pj_scanner *scanner, 352 unsigned N, pj_str_t *out) 353 { 354 register char *s = scanner->curptr; 355 char *start = scanner->curptr; 356 357 PJ_CHECK_STACK(); 358 346 unsigned N, pj_str_t *out) 347 { 359 348 if (scanner->curptr + N > scanner->end) { 360 349 pj_scan_syntax_err(scanner); … … 362 351 } 363 352 364 pj_strset(out, s , N);353 pj_strset(out, scanner->curptr, N); 365 354 366 s += N; 367 scanner->col += (s - start); 368 scanner->curptr = s; 369 370 if (scanner->skip_ws) { 355 scanner->curptr += N; 356 357 if (PJ_SCAN_IS_PROBABLY_SPACE(*scanner->curptr) && scanner->skip_ws) { 371 358 pj_scan_skip_whitespace(scanner); 372 359 } … … 376 363 PJ_DEF(int) pj_scan_get_char( pj_scanner *scanner ) 377 364 { 378 char *start = scanner->curptr; 379 int chr = *start; 380 381 PJ_CHECK_STACK(); 382 383 if (pj_scan_is_eof(scanner)) { 365 int chr = *scanner->curptr; 366 367 if (!chr) { 384 368 pj_scan_syntax_err(scanner); 385 369 return 0; … … 387 371 388 372 ++scanner->curptr; 389 scanner->col += (scanner->curptr - start); 390 391 if (scanner->skip_ws) { 373 374 if (PJ_SCAN_IS_PROBABLY_SPACE(*scanner->curptr) && scanner->skip_ws) { 392 375 pj_scan_skip_whitespace(scanner); 393 376 } … … 398 381 PJ_DEF(void) pj_scan_get_newline( pj_scanner *scanner ) 399 382 { 400 PJ_CHECK_STACK();401 402 383 if (!PJ_SCAN_IS_NEWLINE(*scanner->curptr)) { 403 384 pj_scan_syntax_err(scanner); … … 413 394 414 395 ++scanner->line; 415 scanner-> col = 1;416 417 if ( scanner->skip_ws) {396 scanner->start_line = scanner->curptr; 397 398 if (PJ_SCAN_IS_PROBABLY_SPACE(*scanner->curptr) && scanner->skip_ws) { 418 399 pj_scan_skip_whitespace(scanner); 419 400 } … … 425 406 { 426 407 register char *s = scanner->curptr; 427 register char *end = scanner->end; 428 char *start = s; 429 430 PJ_CHECK_STACK(); 431 432 if (pj_scan_is_eof(scanner)) { 408 409 if (s >= scanner->end) { 433 410 pj_scan_syntax_err(scanner); 434 411 return; … … 441 418 pj_strset3(out, scanner->curptr, s); 442 419 443 scanner->col += (s - start);444 420 scanner->curptr = s; 445 421 446 if ( scanner->skip_ws) {422 if (PJ_SCAN_IS_PROBABLY_SPACE(*s) && scanner->skip_ws) { 447 423 pj_scan_skip_whitespace(scanner); 448 424 } … … 454 430 { 455 431 register char *s = scanner->curptr; 456 register char *end = scanner->end; 457 char *start = s; 458 459 PJ_CHECK_STACK(); 460 461 if (pj_scan_is_eof(scanner)) { 432 433 if (s >= scanner->end) { 462 434 pj_scan_syntax_err(scanner); 463 435 return; … … 470 442 pj_strset3(out, scanner->curptr, s); 471 443 472 scanner->col += (s - start);473 444 scanner->curptr = s; 474 445 475 if ( scanner->skip_ws) {446 if (PJ_SCAN_IS_PROBABLY_SPACE(*s) && scanner->skip_ws) { 476 447 pj_scan_skip_whitespace(scanner); 477 448 } … … 483 454 { 484 455 register char *s = scanner->curptr; 485 register char *end = scanner->end; 486 char *start = scanner->curptr; 487 488 PJ_CHECK_STACK(); 489 490 if (pj_scan_is_eof(scanner)) { 491 pj_scan_syntax_err(scanner); 492 return; 493 } 494 495 while (PJ_SCAN_CHECK_EOF(s) && !strchr(until_spec, *s)) { 496 ++s; 497 } 498 499 pj_strset3(out, scanner->curptr, s); 500 501 scanner->col += (s - start); 456 int speclen; 457 458 if (s >= scanner->end) { 459 pj_scan_syntax_err(scanner); 460 return; 461 } 462 463 speclen = strlen(until_spec); 464 while (PJ_SCAN_CHECK_EOF(s) && !memchr(until_spec, *s, speclen)) { 465 ++s; 466 } 467 468 pj_strset3(out, scanner->curptr, s); 469 502 470 scanner->curptr = s; 503 471 504 if ( scanner->skip_ws) {472 if (PJ_SCAN_IS_PROBABLY_SPACE(*s) && scanner->skip_ws) { 505 473 pj_scan_skip_whitespace(scanner); 506 474 } … … 512 480 char *start = scanner->curptr; 513 481 514 PJ_CHECK_STACK();515 516 482 if (scanner->curptr + N > scanner->end) { 517 483 pj_scan_syntax_err(scanner); … … 520 486 521 487 scanner->curptr += N; 522 scanner->col += (scanner->curptr - start); 523 524 if (skip_ws) { 488 489 if (PJ_SCAN_IS_PROBABLY_SPACE(*scanner->curptr) && skip_ws) { 525 490 pj_scan_skip_whitespace(scanner); 526 491 } … … 547 512 } 548 513 514 PJ_DEF(int) pj_scan_stricmp_alnum( pj_scanner *scanner, const char *s, 515 int len) 516 { 517 if (scanner->curptr + len > scanner->end) { 518 pj_scan_syntax_err(scanner); 519 return -1; 520 } 521 return strnicmp_alnum(scanner->curptr, s, len); 522 } 549 523 550 524 PJ_DEF(void) pj_scan_save_state( pj_scanner *scanner, pj_scan_state *state) 551 525 { 552 PJ_CHECK_STACK();553 554 526 state->curptr = scanner->curptr; 555 527 state->line = scanner->line; 556 state-> col = scanner->col;528 state->start_line = scanner->start_line; 557 529 } 558 530 … … 561 533 pj_scan_state *state) 562 534 { 563 PJ_CHECK_STACK();564 565 535 scanner->curptr = state->curptr; 566 536 scanner->line = state->line; 567 scanner-> col = state->col;568 } 569 570 537 scanner->start_line = state->start_line; 538 } 539 540
Note: See TracChangeset
for help on using the changeset viewer.