aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-05-16 00:03:15 +0000
committerUlrich Drepper <drepper@redhat.com>1998-05-16 00:03:15 +0000
commit66175fa825828d3a012c34777fd9e7916b7aa10b (patch)
treeca5f75b63ac49de0183f88d90a0de25b025743cf
parentc9fc0e2228473b03cad1f5d6e3dfb52446b24ec7 (diff)
downloadglibc-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--ChangeLog18
-rw-r--r--iconv/loop.c16
-rw-r--r--iconvdata/TESTS1
-rw-r--r--iconvdata/iso-2022-kr.c146
-rw-r--r--iconvdata/ksc5601.h2
-rw-r--r--iconvdata/testdata/ISO-2022-KR552
-rw-r--r--wcsmbs/btowc.c2
-rw-r--r--wcsmbs/mbrtowc.c2
-rw-r--r--wcsmbs/mbsnrtowcs.c2
-rw-r--r--wcsmbs/mbsrtowcs.c2
-rw-r--r--wcsmbs/wcrtomb.c2
-rw-r--r--wcsmbs/wcsnrtombs.c2
-rw-r--r--wcsmbs/wcsrtombs.c2
-rw-r--r--wcsmbs/wctob.c2
14 files changed, 664 insertions, 87 deletions
diff --git a/ChangeLog b/ChangeLog
index e7cfdced1e..f27d54e2e5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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,