diff options
author | Russ Cox <rsc@swtch.com> | 2009-09-13 17:43:37 -0400 |
---|---|---|
committer | Russ Cox <rsc@swtch.com> | 2009-09-13 17:43:37 -0400 |
commit | a0583cf2560feff2dcfcccb52279569bcf27fa5e (patch) | |
tree | ac0ef06f341be37b015514b9810c78a9b2ce5817 | |
parent | a21158473db3261329f14e565e3bcc257cc8ccc2 (diff) | |
download | plan9port-a0583cf2560feff2dcfcccb52279569bcf27fa5e.tar.gz plan9port-a0583cf2560feff2dcfcccb52279569bcf27fa5e.tar.bz2 plan9port-a0583cf2560feff2dcfcccb52279569bcf27fa5e.zip |
tcs: update for 32-bit Rune
http://codereview.appspot.com/117063
-rw-r--r-- | src/cmd/tcs/plan9.h | 24 | ||||
-rw-r--r-- | src/cmd/tcs/utf.c | 152 |
2 files changed, 4 insertions, 172 deletions
diff --git a/src/cmd/tcs/plan9.h b/src/cmd/tcs/plan9.h index 4d002cb0..f9366ec4 100644 --- a/src/cmd/tcs/plan9.h +++ b/src/cmd/tcs/plan9.h @@ -1,23 +1 @@ -typedef unsigned short Rune; /* 16 bits */ -typedef unsigned char uchar; -#define Runeerror 0x80 /* decoding error in UTF */ -#define Runeself 0x80 /* rune and UTF sequences are the same (<) */ -#define UTFmax 6 /* maximum bytes per rune */ - -/* - plan 9 argument parsing -*/ -#define ARGBEGIN for((argv0? 0: (argv0= *argv)),argv++,argc--;\ - argv[0] && argv[0][0]=='-' && argv[0][1];\ - argc--, argv++) {\ - char *_args, *_argt, _argc;\ - _args = &argv[0][1];\ - if(_args[0]=='-' && _args[1]==0){\ - argc--; argv++; break;\ - }\ - _argc=0;while(*_args) switch(_argc= *_args++) -#define ARGEND } -#define ARGF() (_argt=_args, _args="",\ - (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) -#define ARGC() _argc -extern char *argv0; +Compatibility file removed; must compile using Plan 9 definitions. diff --git a/src/cmd/tcs/utf.c b/src/cmd/tcs/utf.c index 4045332d..3970e596 100644 --- a/src/cmd/tcs/utf.c +++ b/src/cmd/tcs/utf.c @@ -139,168 +139,22 @@ isoutf_out(Rune *base, int n, long *notused) } -enum -{ - Char1 = Runeself, Rune1 = Runeself, - Char21 = 0xA1, Rune21 = 0x0100, - Char22 = 0xF6, Rune22 = 0x4016, - Char3 = 0xFC, Rune3 = 0x10000, /* really 0x38E2E */ - Esc = 0xBE, Bad = Runeerror -}; - -static uchar U[256]; -static uchar T[256]; - -static -void -mktable(void) -{ - int i, u; - - for(i=0; i<256; i++) { - u = i + (0x5E - 0xA0); - if(i < 0xA0) - u = i + (0xDF - 0x7F); - if(i < 0x7F) - u = i + (0x00 - 0x21); - if(i < 0x21) - u = i + (0xBE - 0x00); - U[i] = u; - T[u] = i; - } -} - int isochartorune(Rune *rune, char *str) { - int c, c1, c2; - long l; - - if(U[0] == 0) - mktable(); - - /* - * one character sequence - * 00000-0009F => 00-9F - */ - c = *(uchar*)str; - if(c < Char1) { - *rune = c; - return 1; - } - - /* - * two character sequence - * 000A0-000FF => A0; A0-FF - */ - c1 = *(uchar*)(str+1); - if(c < Char21) { - if(c1 >= Rune1 && c1 < Rune21) { - *rune = c1; - return 2; - } - goto bad; - } - - /* - * two character sequence - * 00100-04015 => A1-F5; 21-7E/A0-FF - */ - c1 = U[c1]; - if(c1 >= Esc) - goto bad; - if(c < Char22) { - *rune = (c-Char21)*Esc + c1 + Rune21; - return 2; - } - - /* - * three character sequence - * 04016-38E2D => A6-FB; 21-7E/A0-FF - */ - c2 = U[*(uchar*)(str+2)]; - if(c2 >= Esc) - goto bad; - if(c < Char3) { - l = (c-Char22)*Esc*Esc + c1*Esc + c2 + Rune22; - if(l >= Rune3) - goto bad; - *rune = l; - return 3; - } - - /* - * bad decoding - */ -bad: - *rune = Bad; - return 1; + return chartorune(rune, str); } int runetoisoutf(char *str, Rune *rune) { - long c; - - if(T[0] == 0) - mktable(); - - /* - * one character sequence - * 00000-0009F => 00-9F - */ - c = *rune; - if(c < Rune1) { - str[0] = c; - return 1; - } - - /* - * two character sequence - * 000A0-000FF => A0; A0-FF - */ - if(c < Rune21) { - str[0] = (char)Char1; - str[1] = c; - return 2; - } - - /* - * two character sequence - * 00100-04015 => A1-F5; 21-7E/A0-FF - */ - if(c < Rune22) { - c -= Rune21; - str[0] = c/Esc + Char21; - str[1] = T[c%Esc]; - return 2; - } - - /* - * three character sequence - * 04016-38E2D => A6-FB; 21-7E/A0-FF - */ - c -= Rune22; - str[0] = c/(Esc*Esc) + Char22; - str[1] = T[c/Esc%Esc]; - str[2] = T[c%Esc]; - return 3; + return runetochar(str, rune); } int fullisorune(char *str, int n) { - int c; - - if(n > 0) { - c = *(uchar*)str; - if(c < Char1) - return 1; - if(n > 1) - if(c < Char22 || n > 2) - return 1; - } - return 0; + return fullrune(str, n); } enum |