diff options
| author | Ulrich Drepper <drepper@redhat.com> | 1998-05-16 00:03:15 +0000 |
|---|---|---|
| committer | Ulrich Drepper <drepper@redhat.com> | 1998-05-16 00:03:15 +0000 |
| commit | 66175fa825828d3a012c34777fd9e7916b7aa10b (patch) | |
| tree | ca5f75b63ac49de0183f88d90a0de25b025743cf | |
| parent | c9fc0e2228473b03cad1f5d6e3dfb52446b24ec7 (diff) | |
| download | glibc-66175fa825828d3a012c34777fd9e7916b7aa10b.tar.xz glibc-66175fa825828d3a012c34777fd9e7916b7aa10b.zip | |
Update.
* iconv/loop.c: Let user add code to use and set paramaters.
* iconvdata/iso-2022-kr.c: Correct to-loop.
* iconvdata/ksc5601.h (ksc5601_to_ucs4): Use correct value to find
hanja.
* iconvdata/TESTS: Add ISO-2022-KR test.
* iconvdata/testdata/ISO-2022-KR: New file.
* wcsmbs/btowc.c: Likewise.
* wcsmbs/mbrtowcs.c: Likewise.
* wcsmbs/mbsnrtowcs.c: Likewise.
* wcsmbs/mbsrtowcs.c: Likewise.
* wcsmbs/wcrtomb.c: Likewise.
* wcsmbs/wcsnrtombs.c: Likewise.
* wcsmbs/wcsrtombs.c: Likewise.
* wcsmbs/wctob.c: Likewise.
| -rw-r--r-- | ChangeLog | 18 | ||||
| -rw-r--r-- | iconv/loop.c | 16 | ||||
| -rw-r--r-- | iconvdata/TESTS | 1 | ||||
| -rw-r--r-- | iconvdata/iso-2022-kr.c | 146 | ||||
| -rw-r--r-- | iconvdata/ksc5601.h | 2 | ||||
| -rw-r--r-- | iconvdata/testdata/ISO-2022-KR | 552 | ||||
| -rw-r--r-- | wcsmbs/btowc.c | 2 | ||||
| -rw-r--r-- | wcsmbs/mbrtowc.c | 2 | ||||
| -rw-r--r-- | wcsmbs/mbsnrtowcs.c | 2 | ||||
| -rw-r--r-- | wcsmbs/mbsrtowcs.c | 2 | ||||
| -rw-r--r-- | wcsmbs/wcrtomb.c | 2 | ||||
| -rw-r--r-- | wcsmbs/wcsnrtombs.c | 2 | ||||
| -rw-r--r-- | wcsmbs/wcsrtombs.c | 2 | ||||
| -rw-r--r-- | wcsmbs/wctob.c | 2 |
14 files changed, 664 insertions, 87 deletions
@@ -1,14 +1,32 @@ 1998-05-15 Ulrich Drepper <drepper@cygnus.com> + * iconv/loop.c: Let user add code to use and set paramaters. + + * iconvdata/iso-2022-kr.c: Correct to-loop. + * iconvdata/iso-2022-kr.c (PREPARE_LOOP): Use correct variable to point to output buffer. + * iconvdata/ksc5601.h (ksc5601_to_ucs4): Use correct value to find + hanja. + + * iconvdata/TESTS: Add ISO-2022-KR test. + * iconvdata/testdata/ISO-2022-KR: New file. + 1998-05-15 21:07 Ulrich Drepper <drepper@cygnus.com> * iconv/gconv.h (gconv_step_data): Add new fields invocation_counter and internal_use. * iconv/gconv_open.c (__gconv_open): Initialize invocation_counter and internal_use. + * wcsmbs/btowc.c: Likewise. + * wcsmbs/mbrtowcs.c: Likewise. + * wcsmbs/mbsnrtowcs.c: Likewise. + * wcsmbs/mbsrtowcs.c: Likewise. + * wcsmbs/wcrtomb.c: Likewise. + * wcsmbs/wcsnrtombs.c: Likewise. + * wcsmbs/wcsrtombs.c: Likewise. + * wcsmbs/wctob.c: Likewise. * iconv/skeleton.c: Increment invocation_counter. * iconvdata/iso-2022-kr.c: When used in iconv() emit designator sequence first. diff --git a/iconv/loop.c b/iconv/loop.c index f8188873dc..596f8a6441 100644 --- a/iconv/loop.c +++ b/iconv/loop.c @@ -44,7 +44,10 @@ BODY this is supposed to expand to the body of the loop. The user must provide this. - EXTRA_LOOP_DECLS Extra arguments passed from converion loop call. + EXTRA_LOOP_DECLS extra arguments passed from converion loop call. + + INIT_PARAMS code to define and initialize variables from params. + UPDATE_PARAMS code to store result in params. */ #include <gconv.h> @@ -134,6 +137,10 @@ LOOPFCT (const unsigned char **inptrp, const unsigned char *inend, size_t min_out_rounds = (outend - outptr) / MAX_NEEDED_OUTPUT; size_t min_rounds = MIN (min_in_rounds, min_out_rounds); +#ifdef INIT_PARAMS + INIT_PARAMS; +#endif + #undef NEED_LENGTH_TEST #define NEED_LENGTH_TEST 0 while (min_rounds-- > 0) @@ -195,7 +202,7 @@ LOOPFCT (const unsigned char **inptrp, const unsigned char *inend, /* Here comes the body the user provides. It can stop with RESULT set to GCONV_INCOMPLETE_INPUT (if the size of the input characters vary in size), GCONV_ILLEGAL_INPUT, or - GCONV_FULL_OUTPUT (if the output characters vary in size. */ + GCONV_FULL_OUTPUT (if the output characters vary in size). */ BODY /* If necessary count the successful conversion. */ @@ -216,6 +223,9 @@ LOOPFCT (const unsigned char **inptrp, const unsigned char *inend, /* Update the pointers pointed to by the parameters. */ *inptrp = inptr; *outptrp = outptr; +#ifdef UPDATE_PARAMS + UPDATE_PARAMS; +#endif return result; } @@ -232,3 +242,5 @@ LOOPFCT (const unsigned char **inptrp, const unsigned char *inend, #undef BODY #undef LOOPFCT #undef EXTRA_LOOP_DECLS +#undef INIT_PARAMS +#undef UPDATE_PARAMS diff --git a/iconvdata/TESTS b/iconvdata/TESTS index fa4aea69b5..e8a586cd2d 100644 --- a/iconvdata/TESTS +++ b/iconvdata/TESTS @@ -73,3 +73,4 @@ CP1254 CP1254 Y UTF8 CP1255 CP1255 Y UTF8 CP1256 CP1256 Y UTF8 CP1257 CP1257 Y UTF8 +ISO-2022-KR ISO-2022-KR Y UTF8 diff --git a/iconvdata/iso-2022-kr.c b/iconvdata/iso-2022-kr.c index 166fa15072..6746f9c2ac 100644 --- a/iconvdata/iso-2022-kr.c +++ b/iconvdata/iso-2022-kr.c @@ -44,7 +44,7 @@ #define MAX_NEEDED_TO 4 #define PREPARE_LOOP \ int save_set; \ - int set = data->statep->count; \ + int *setp = &data->statep->count; \ if (!FROM_DIRECTION && !data->internal_use && data->invocation_counter == 0)\ { \ /* Emit the designator sequence. */ \ @@ -56,7 +56,7 @@ *outbuf++ = ')'; \ *outbuf++ = 'C'; \ } -#define EXTRA_LOOP_ARGS , set +#define EXTRA_LOOP_ARGS , setp /* The COUNT element of the state keeps track of the currently selected @@ -72,27 +72,27 @@ enum the output state to the initial state. This has to be done during the flushing. */ #define EMIT_SHIFT_TO_INIT \ - if (data->statep->count != 0) \ + if (data->statep->count != ASCII_set) \ { \ - if (step->data == &from_object) \ + if (FROM_DIRECTION) \ /* It's easy, we don't have to emit anything, we just reset the \ state for the input. */ \ - data->statep->count = 0; \ + data->statep->count = ASCII_set; \ else \ { \ char *outbuf = data->outbuf; \ \ /* We are not in the initial state. To switch back we have \ - to emit `SO'. */ \ + to emit `SI'. */ \ if (outbuf == data->outbufend) \ /* We don't have enough room in the output buffer. */ \ status = GCONV_FULL_OUTPUT; \ else \ { \ /* Write out the shift sequence. */ \ - *outbuf++ = SO; \ + *outbuf++ = SI; \ data->outbuf = outbuf; \ - data->statep->count = 0; \ + data->statep->count = ASCII_set; \ } \ } \ } @@ -102,9 +102,9 @@ enum and retore the state. */ #define SAVE_RESET_STATE(Save) \ if (Save) \ - save_set = set; \ + save_set = *setp; \ else \ - set = save_set + *setp = save_set /* First define the conversion function from ISO-2022-JP to UCS4. */ @@ -127,14 +127,14 @@ enum if (ch == ESC) \ { \ /* We don't really have to handle escape sequences since all the \ - switching is done using the SI and SO bytes. Butwe have to \ + switching is done using the SI and SO bytes. But we have to \ recognize `Esc $ ) C' since this is a kind of flag for this \ encoding. We simply ignore it. */ \ if (inptr + 1 > inend \ || (inptr[1] == '$' \ && (inptr + 2 > inend \ || (inptr[2] == ')' && inptr + 3 > inend)))) \ - \ + \ { \ result = GCONV_EMPTY_INPUT; \ break; \ @@ -146,14 +146,14 @@ enum continue; \ } \ } \ - else if (ch == SI) \ + else if (ch == SO) \ { \ /* Switch to use KSC. */ \ ++inptr; \ set = KSC5601_set; \ continue; \ } \ - else if (ch == SO) \ + else if (ch == SI) \ { \ /* Switch to use ASCII. */ \ ++inptr; \ @@ -161,9 +161,16 @@ enum continue; \ } \ \ - if (set == ASCII_set || ch < 0x21 || ch == 0x7f) \ - /* Almost done, just advance the input pointer. */ \ - ++inptr; \ + if (set == ASCII_set) \ + { \ + if (ch >= 0x80) \ + { \ + result = GCONV_ILLEGAL_INPUT; \ + break; \ + } \ + /* Almost done, just advance the input pointer. */ \ + ++inptr; \ + } \ else \ { \ assert (set == KSC5601_set); \ @@ -186,7 +193,9 @@ enum \ *((uint32_t *) outptr)++ = ch; \ } -#define EXTRA_LOOP_DECLS , int set +#define EXTRA_LOOP_DECLS , int *setp +#define INIT_PARAMS int set = *setp +#define UPDATE_PARAMS *setp = set #include <iconv/loop.c> @@ -197,97 +206,66 @@ enum #define LOOPFCT TO_LOOP #define BODY \ { \ - unsigned char ch; \ + uint32_t ch; \ size_t written = 0; \ \ ch = *((uint32_t *) inptr); \ \ /* First see whether we can write the character using the currently \ selected character set. */ \ - if (set == ASCII_set || (ch >= 0x01 && (ch < 0x21 || ch == 0x7f))) \ + if (ch < 0x80) \ { \ - /* Please note that the NUL byte is *not* matched if we are not \ - currently using the ASCII charset. This is because we must \ - switch to the initial state whenever a NUL byte is written. */ \ - if (ch <= 0x7f) \ + if (set != ASCII_set) \ { \ - *outptr++ = ch; \ - written = 1; \ + *outptr++ = SI; \ + set = ASCII_set; \ + if (NEED_LENGTH_TEST && outptr == outend) \ + { \ + result = GCONV_FULL_OUTPUT; \ + break; \ + } \ } \ + \ + *outptr++ = ch; \ + written = 1; \ } \ else \ { \ - assert (set == KSC5601_set); \ + char buf[2]; \ \ - written = ucs4_to_ksc5601 (ch, outptr, \ - (NEED_LENGTH_TEST ? outend - outptr : 2)); \ + written = ucs4_to_ksc5601 (ch, buf, 2); \ \ - if (NEED_LENGTH_TEST && written == 0) \ + if (written == UNKNOWN_10646_CHAR) \ { \ - result = GCONV_FULL_OUTPUT; \ + /* Illegal character. */ \ + result = GCONV_ILLEGAL_INPUT; \ break; \ } \ - if (written == UNKNOWN_10646_CHAR) \ - { \ - /* Either this is an unknown character or we have to switch \ - the currently selected character set. The character sets \ - do not code entirely separate parts of ISO 10646 and \ - therefore there is no single correct result. If we choose \ - the character set to use wrong we might be end up with \ - using yet another character set for the next character \ - though the current and the next could be encoded with one \ - character set. We leave this kind of optimization for \ - later and now simply use a fixed order in which we test for \ - availability */ \ - \ - if (ch <= 0x7f) \ - { \ - /* We must encode using ASCII. First write out the \ - escape sequence. */ \ - *outptr++ = SO; \ - set = ASCII_set; \ - \ - if (NEED_LENGTH_TEST && outptr == outend) \ - { \ - result = GCONV_FULL_OUTPUT; \ - break; \ - } \ - \ - *outptr++ = ch; \ - } \ - else \ - { \ - char buf[2]; \ + assert (written == 2); \ \ - written = ucs4_to_ksc5601 (ch, buf, 2); \ - if (written != UNKNOWN_10646_CHAR) \ - { \ - /* We use KSC 5601. */ \ - *outptr++ = SI; \ - set = KSC5601_set; \ - \ - if (NEED_LENGTH_TEST && outptr + 2 > outend) \ - { \ - result = GCONV_FULL_OUTPUT; \ - break; \ - } \ + /* We use KSC 5601. */ \ + if (set != KSC5601_set) \ + { \ + *outptr++ = SO; \ + set = KSC5601_set; \ + } \ \ - *outptr++ = buf[0]; \ - *outptr++ = buf[1]; \ - } \ - else \ - { \ - result = GCONV_ILLEGAL_INPUT; \ - break; \ - } \ - } \ + if (NEED_LENGTH_TEST && outptr + 2 > outend) \ + { \ + result = GCONV_FULL_OUTPUT; \ + break; \ } \ + \ + *outptr++ = buf[0]; \ + *outptr++ = buf[1]; \ } \ \ /* Now that we wrote the output increment the input pointer. */ \ inptr += 4; \ } -#define EXTRA_LOOP_DECLS , int set +#define EXTRA_LOOP_DECLS , int *setp +#define INIT_PARAMS int set = *setp +#define UPDATE_PARAMS *setp = set #include <iconv/loop.c> diff --git a/iconvdata/ksc5601.h b/iconvdata/ksc5601.h index 0e77c76b96..0b10dcd6b3 100644 --- a/iconvdata/ksc5601.h +++ b/iconvdata/ksc5601.h @@ -73,7 +73,7 @@ ksc5601_to_ucs4 (const unsigned char **s, size_t avail, unsigned char offset) if (idx >= 1410 && idx < 3760) return (__ksc5601_hangul_to_ucs[idx - 1410] ?: ((*s) -= 2, UNKNOWN_10646_CHAR)); - else if (idx > 3854) + else if (idx >= 3854) /* Hanja : row 42 - row 93 : 3854 = 94 * (42-1) */ return (__ksc5601_hanja_to_ucs[idx - 3854] ?: ((*s) -= 2, UNKNOWN_10646_CHAR)); diff --git a/iconvdata/testdata/ISO-2022-KR b/iconvdata/testdata/ISO-2022-KR new file mode 100644 index 0000000000..619b76f1c8 --- /dev/null +++ b/iconvdata/testdata/ISO-2022-KR @@ -0,0 +1,552 @@ +$)C + !! !" !# !$ !% !& !' !( !) !* !+ !, !- !. !/ +!0 !1 !2 !3 !4 !5 !6 !7 !8 !9 !: !; !< != !> !? +!@ !A !B !C !D !E !F !G !H !I !J !K !L !M !N !O +!P !Q !R !S !T !U !V !W !X !Y !Z ![ !\ !] !^ !_ +!` !a !b !c !d !e !f !g !h !i !j !k !l !m !n !o +!p !q !r !s !t !u !v !w !x !y !z !{ !| !} !~ + "! "" "# "$ "% "& "' "( ") "* "+ ", "- ". "/ +"0 "1 "2 "3 "4 "5 "6 "7 "8 "9 ": "; "< "= "> "? +"@ "A "B "C "D "E "F "G "H "I "J "K "L "M "N "O +"P "Q "R "S "T "U "V "W "X "Y "Z "[ "\ "] "^ "_ +"` "a "b "c "d "e + + #! #" ## #$ #% #& #' #( #) #* #+ #, #- #. #/ +#0 #1 #2 #3 #4 #5 #6 #7 #8 #9 #: #; #< #= #> #? +#@ #A #B #C #D #E #F #G #H #I #J #K #L #M #N #O +#P #Q #R #S #T #U #V #W #X #Y #Z #[ #\ #] #^ #_ +#` #a #b #c #d #e #f #g #h #i #j #k #l #m #n #o +#p #q #r #s #t #u #v #w #x #y #z #{ #| #} #~ + $! $" $# $$ $% $& $' $( $) $* $+ $, $- $. $/ +$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $: $; $< $= $> $? +$@ $A $B $C $D $E $F $G $H $I $J $K $L $M $N $O +$P $Q $R $S $T $U $V $W $X $Y $Z $[ $\ $] $^ $_ +$` $a $b $c $d $e $f $g $h $i $j $k $l $m $n $o +$p $q $r $s $t $u $v $w $x $y $z ${ $| $} $~ + %! %" %# %$ %% %& %' %( %) %* +%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 + %A %B %C %D %E %F %G %H %I %J %K %L %M %N %O +%P %Q %R %S %T %U %V %W %X + %a %b %c %d %e %f %g %h %i %j %k %l %m %n %o +%p %q %r %s %t %u %v %w %x + &! &" &# &$ &% && &' &( &) &* &+ &, &- &. &/ +&0 &1 &2 &3 &4 &5 &6 &7 &8 &9 &: &; &< &= &> &? +&@ &A &B &C &D &E &F &G &H &I &J &K &L &M &N &O +&P &Q &R &S &T &U &V &W &X &Y &Z &[ &\ &] &^ &_ +&` &a &b &c &d + + '! '" '# '$ '% '& '' '( ') '* '+ ', '- '. '/ +'0 '1 '2 '3 '4 '5 '6 '7 '8 '9 ': '; '< '= '> '? +'@ 'A 'B 'C 'D 'E 'F 'G 'H 'I 'J 'K 'L 'M 'N 'O +'P 'Q 'R 'S 'T 'U 'V 'W 'X 'Y 'Z '[ '\ '] '^ '_ +'` 'a 'b 'c 'd 'e 'f 'g 'h 'i 'j 'k 'l 'm 'n 'o + + (! (" (# ($ (& (( () (* (+ (, (- (. (/ + (1 (2 (3 (4 (5 (6 (7 (8 (9 (: (; (< (= (> (? +(@ (A (B (C (D (E (F (G (H (I (J (K (L (M (N (O +(P (Q (R (S (T (U (V (W (X (Y (Z ([ (\ (] (^ (_ +(` (a (b (c (d (e (f (g (h (i (j (k (l (m (n (o +(p (q (r (s (t (u (v (w (x (y (z ({ (| (} (~ + )! )" )# )$ )% )& )' )( )) )* )+ ), )- ). )/ +)0 )1 )2 )3 )4 )5 )6 )7 )8 )9 ): ); )< )= )> )? +)@ )A )B )C )D )E )F )G )H )I )J )K )L )M )N )O +)P )Q )R )S )T )U )V )W )X )Y )Z )[ )\ )] )^ )_ +)` )a )b )c )d )e )f )g )h )i )j )k )l )m )n )o +)p )q )r )s )t )u )v )w )x )y )z ){ )| )} )~ + *! *" *# *$ *% *& *' *( *) ** *+ *, *- *. */ +*0 *1 *2 *3 *4 *5 *6 *7 *8 *9 *: *; *< *= *> *? +*@ *A *B *C *D *E *F *G *H *I *J *K *L *M *N *O +*P *Q *R *S *T *U *V *W *X *Y *Z *[ *\ *] *^ *_ +*` *a *b *c *d *e *f *g *h *i *j *k *l *m *n *o +*p *q *r *s + +! +" +# +$ +% +& +' +( +) +* ++ +, +- +. +/ ++0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; +< += +> +? ++@ +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O ++P +Q +R +S +T +U +V +W +X +Y +Z +[ +\ +] +^ +_ ++` +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o ++p +q +r +s +t +u +v + ,! ," ,# ,$ ,% ,& ,' ,( ,) ,* ,+ ,, ,- ,. ,/ +,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,: ,; ,< ,= ,> ,? +,@ ,A + ,Q ,R ,S ,T ,U ,V ,W ,X ,Y ,Z ,[ ,\ ,] ,^ ,_ +,` ,a ,b ,c ,d ,e ,f ,g ,h ,i ,j ,k ,l ,m ,n ,o +,p ,q + + + + + + 0! 0" 0# 0$ 0% 0& 0' 0( 0) 0* 0+ 0, 0- 0. 0/ +00 01 02 03 04 05 06 07 08 09 0: 0; 0< 0= 0> 0? +0@ 0A 0B 0C 0D 0E 0F 0G 0H 0I 0J 0K 0L 0M 0N 0O +0P 0Q 0R 0S 0T 0U 0V 0W 0X 0Y 0Z 0[ 0\ 0] 0^ 0_ +0` 0a 0b 0c 0d 0e 0f 0g 0h 0i 0j 0k 0l 0m 0n 0o +0p 0q 0r 0s 0t 0u 0v 0w 0x 0y 0z 0{ 0| 0} 0~ + 1! 1" 1# 1$ 1% 1& 1' 1( 1) 1* 1+ 1, 1- 1. 1/ +10 11 12 13 14 15 16 17 18 19 1: 1; 1< 1= 1> 1? +1@ 1A 1B 1C 1D 1E 1F 1G 1H 1I 1J 1K 1L 1M 1N 1O +1P 1Q 1R 1S 1T 1U 1V 1W 1X 1Y 1Z 1[ 1\ 1] 1^ 1_ +1` 1a 1b 1c 1d 1e 1f 1g 1h 1i 1j 1k 1l 1m 1n 1o +1p 1q 1r 1s 1t 1u 1v 1w 1x 1y 1z 1{ 1| 1} 1~ + 2! 2" 2# 2$ 2% 2& 2' 2( 2) 2* 2+ 2, 2- 2. 2/ +20 21 22 23 24 25 26 27 28 29 2: 2; 2< 2= 2> 2? +2@ 2A 2B 2C 2D 2E 2F 2G 2H 2I 2J 2K 2L 2M 2N 2O +2P 2Q 2R 2S 2T 2U 2V 2W 2X 2Y 2Z 2[ 2\ 2] 2^ 2_ +2` 2a 2b 2c 2d 2e 2f 2g 2h 2i 2j 2k 2l 2m 2n 2o +2p 2q 2r 2s 2t 2u 2v 2w 2x 2y 2z 2{ 2| 2} 2~ + 3! 3" 3# 3$ 3% 3& 3' 3( 3) 3* 3+ 3, 3- 3. 3/ +30 31 32 33 34 35 36 37 38 39 3: 3; 3< 3= 3> 3? +3@ 3A 3B 3C 3D 3E 3F 3G 3H 3I 3J 3K 3L 3M 3N 3O +3P 3Q 3R 3S 3T 3U 3V 3W 3X 3Y 3Z 3[ 3\ 3] 3^ 3_ +3` 3a 3b 3c 3d 3e 3f 3g 3h 3i 3j 3k 3l 3m 3n 3o +3p 3q 3r 3s 3t 3u 3v 3w 3x 3y 3z 3{ 3| 3} 3~ + 4! 4" 4# 4$ 4% 4& 4' 4( 4) 4* 4+ 4, 4- 4. 4/ +40 41 42 43 44 45 46 47 48 49 4: 4; 4< 4= 4> 4? +4@ 4A 4B 4C 4D 4E 4F 4G 4H 4I 4J 4K 4L 4M 4N 4O +4P 4Q 4R 4S 4T 4U 4V 4W 4X 4Y 4Z 4[ 4\ 4] 4^ 4_ +4` 4a 4b 4c 4d 4e 4f 4g 4h 4i 4j 4k 4l 4m 4n 4o +4p 4q 4r 4s 4t 4u 4v 4w 4x 4y 4z 4{ 4| 4} 4~ + 5! 5" 5# 5$ 5% 5& 5' 5( 5) 5* 5+ 5, 5- 5. 5/ +50 51 52 53 54 55 56 57 58 59 5: 5; 5< 5= 5> 5? +5@ 5A 5B 5C 5D 5E 5F 5G 5H 5I 5J 5K 5L 5M 5N 5O +5P 5Q 5R 5S 5T 5U 5V 5W 5X 5Y 5Z 5[ 5\ 5] 5^ 5_ +5` 5a 5b 5c 5d 5e 5f 5g 5h 5i 5j 5k 5l 5m 5n 5o +5p 5q 5r 5s 5t 5u 5v 5w 5x 5y 5z 5{ 5| 5} 5~ + 6! 6" 6# 6$ 6% 6& 6' 6( 6) 6* 6+ 6, |
