comparison src/character.h @ 91805:c330bf7419fd

(FETCH_STRING_CHAR_ADVANCE, FETCH_STRING_CHAR_AS_MULTIBYTE_ADVANCE) (FETCH_STRING_CHAR_ADVANCE_NO_CHECK): Use SDATA and SREF. (DEC_POS, BUF_DEC_POS): Use BEG_BYTE rather than hardcoding 1.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 12 Feb 2008 21:27:54 +0000
parents acb32817f0e8
children 29adfc9354e7
comparison
equal deleted inserted replaced
91804:d2dce25da0cb 91805:c330bf7419fd
383 do \ 383 do \
384 { \ 384 { \
385 CHARIDX++; \ 385 CHARIDX++; \
386 if (STRING_MULTIBYTE (STRING)) \ 386 if (STRING_MULTIBYTE (STRING)) \
387 { \ 387 { \
388 unsigned char *ptr = &XSTRING (STRING)->data[BYTEIDX]; \ 388 unsigned char *ptr = &SDATA (STRING)[BYTEIDX]; \
389 int len; \ 389 int len; \
390 \ 390 \
391 OUTPUT = STRING_CHAR_AND_LENGTH (ptr, 0, len); \ 391 OUTPUT = STRING_CHAR_AND_LENGTH (ptr, 0, len); \
392 BYTEIDX += len; \ 392 BYTEIDX += len; \
393 } \ 393 } \
394 else \ 394 else \
395 OUTPUT = XSTRING (STRING)->data[BYTEIDX++]; \ 395 { \
396 OUTPUT = SREF (STRING, BYTEIDX); \
397 BYTEIDX++; \
398 } \
396 } \ 399 } \
397 while (0) 400 while (0)
398 401
399 /* Like FETCH_STRING_CHAR_ADVANCE but return a multibyte character eve 402 /* Like FETCH_STRING_CHAR_ADVANCE but return a multibyte character eve
400 if STRING is unibyte. */ 403 if STRING is unibyte. */
403 do \ 406 do \
404 { \ 407 { \
405 CHARIDX++; \ 408 CHARIDX++; \
406 if (STRING_MULTIBYTE (STRING)) \ 409 if (STRING_MULTIBYTE (STRING)) \
407 { \ 410 { \
408 unsigned char *ptr = &XSTRING (STRING)->data[BYTEIDX]; \ 411 unsigned char *ptr = &SDATA (STRING)[BYTEIDX]; \
409 int len; \ 412 int len; \
410 \ 413 \
411 OUTPUT = STRING_CHAR_AND_LENGTH (ptr, 0, len); \ 414 OUTPUT = STRING_CHAR_AND_LENGTH (ptr, 0, len); \
412 BYTEIDX += len; \ 415 BYTEIDX += len; \
413 } \ 416 } \
414 else \ 417 else \
415 { \ 418 { \
416 OUTPUT = XSTRING (STRING)->data[BYTEIDX++]; \ 419 OUTPUT = SREF (STRING, BYTEIDX); \
420 BYTEIDX++; \
417 MAKE_CHAR_MULTIBYTE (OUTPUT); \ 421 MAKE_CHAR_MULTIBYTE (OUTPUT); \
418 } \ 422 } \
419 } \ 423 } \
420 while (0) 424 while (0)
421 425
423 /* Like FETCH_STRING_CHAR_ADVANCE but assumes STRING is multibyte. */ 427 /* Like FETCH_STRING_CHAR_ADVANCE but assumes STRING is multibyte. */
424 428
425 #define FETCH_STRING_CHAR_ADVANCE_NO_CHECK(OUTPUT, STRING, CHARIDX, BYTEIDX) \ 429 #define FETCH_STRING_CHAR_ADVANCE_NO_CHECK(OUTPUT, STRING, CHARIDX, BYTEIDX) \
426 do \ 430 do \
427 { \ 431 { \
428 unsigned char *ptr = &XSTRING (STRING)->data[BYTEIDX]; \ 432 unsigned char *ptr = &SDATA (STRING)[BYTEIDX]; \
429 int len; \ 433 int len; \
430 \ 434 \
431 OUTPUT = STRING_CHAR_AND_LENGTH (ptr, 0, len); \ 435 OUTPUT = STRING_CHAR_AND_LENGTH (ptr, 0, len); \
432 BYTEIDX += len; \ 436 BYTEIDX += len; \
433 CHARIDX++; \ 437 CHARIDX++; \
491 do { \ 495 do { \
492 unsigned char *p; \ 496 unsigned char *p; \
493 \ 497 \
494 pos_byte--; \ 498 pos_byte--; \
495 if (pos_byte < GPT_BYTE) \ 499 if (pos_byte < GPT_BYTE) \
496 p = BEG_ADDR + pos_byte - 1; \ 500 p = BEG_ADDR + pos_byte - BEG_BYTE; \
497 else \ 501 else \
498 p = BEG_ADDR + GAP_SIZE + pos_byte - 1; \ 502 p = BEG_ADDR + GAP_SIZE + pos_byte - BEG_BYTE;\
499 while (!CHAR_HEAD_P (*p)) \ 503 while (!CHAR_HEAD_P (*p)) \
500 { \ 504 { \
501 p--; \ 505 p--; \
502 pos_byte--; \ 506 pos_byte--; \
503 } \ 507 } \
549 #define BUF_DEC_POS(buf, pos_byte) \ 553 #define BUF_DEC_POS(buf, pos_byte) \
550 do { \ 554 do { \
551 unsigned char *p; \ 555 unsigned char *p; \
552 pos_byte--; \ 556 pos_byte--; \
553 if (pos_byte < BUF_GPT_BYTE (buf)) \ 557 if (pos_byte < BUF_GPT_BYTE (buf)) \
554 p = BUF_BEG_ADDR (buf) + pos_byte - 1; \ 558 p = BUF_BEG_ADDR (buf) + pos_byte - BEG_BYTE; \
555 else \ 559 else \
556 p = BUF_BEG_ADDR (buf) + BUF_GAP_SIZE (buf) + pos_byte - 1; \ 560 p = BUF_BEG_ADDR (buf) + BUF_GAP_SIZE (buf) + pos_byte - BEG_BYTE;\
557 while (!CHAR_HEAD_P (*p)) \ 561 while (!CHAR_HEAD_P (*p)) \
558 { \ 562 { \
559 p--; \ 563 p--; \
560 pos_byte--; \ 564 pos_byte--; \
561 } \ 565 } \