1 /***********************************************************************
2  *	��¿�ʴؿ�
3  ************************************************************************/
4 #include <string.h>
5 
6 /*===========================================================================
7  * ��ʸ������ʸ���ζ��̤ʤ���ʸ������� (stricmp/strcasecmp ?)
8  *	�����: ���׻� == 0, �԰��׻� != 0 (�羮��ӤϤʤ�)
9  *===========================================================================*/
my_strcmp(const char * s,const char * d)10 int	my_strcmp( const char *s, const char *d )
11 {
12   if( s==NULL || d==NULL ) return 1;
13 
14   while( tolower(*s) == tolower(*d) ){
15     if( *s == '\0' ) return 0;
16     s++;
17     d++;
18   }
19   return 1;
20 }
21 
22 /*===========================================================================
23  * ʸ���� ct �� ʸ���� s �� ���ԡ� (strlcpy ?)
24  *	s ��ʸ����ü�ϡ�ɬ�� '\0' �Ȥʤꡢs ��Ĺ���� n-1 ʸ���ʲ��˼��ޤ롣
25  *	;ʬ���ΰ�� \0 �������ʤ���
26  *	�����: �ʤ�
27  *===========================================================================*/
my_strncpy(char * s,const char * ct,unsigned long n)28 void	my_strncpy( char *s, const char *ct, unsigned long n )
29 {
30   s[0] = '\0';
31   strncat( s, ct, n-1 );
32 }
33 
34 /*===========================================================================
35  * ʸ���� ct �� ʸ���� s �� Ϣ�� (strlcat ?)
36  *	s ��ʸ����ü�ϡ�ɬ�� '\0' �Ȥʤꡢs ��Ĺ���� n-1 ʸ���ʲ��˼��ޤ롣
37  *	�����: �ʤ�
38  *===========================================================================*/
my_strncat(char * s,const char * ct,unsigned long n)39 void	my_strncat( char *s, const char *ct, unsigned long n )
40 {
41   size_t used = strlen(s) + 1;
42 
43   if( n > used )
44     strncat( s, ct, n - used );
45 }
46 
47 /*===========================================================================
48  * SJIS �� EUC ���Ѵ� (���ʤ�Ŭ��)
49  *	*sjis_p ��ʸ����� EUC ���Ѵ����ơ�*euc_p �˳�Ǽ���롣
50  *
51  *	��ա��ˤ��δؿ��ϡ��Хåե����դ������å����Ƥ��ʤ���
52  *		*euc_p �ϡ�*sjis_p ���ܰʾ��Ĺ�����ʤ��ȴ�
53  *===========================================================================*/
sjis2euc(char * euc_p,const char * sjis_p)54 void	sjis2euc( char *euc_p, const char *sjis_p )
55 {
56   int	h,l, h2, l2;
57 
58   while( ( h = (unsigned char)*sjis_p++ ) ){
59 
60     if( h < 0x80 ){				/* ASCII */
61 
62       *euc_p ++ = h;
63 
64     }else if( 0xa1 <= h && h <= 0xdf ){		/* Ⱦ�ѥ��� */
65 
66       *euc_p ++ = (char)0x8e;
67       *euc_p ++ = h;
68 
69     }else{					/* ����ʸ�� */
70 
71       if( ( l = (unsigned char)*sjis_p++ ) ){
72 
73 	if( l <= 0x9e ){
74 	  if( h <= 0x9f ) h2 = (h - 0x71) *2 +1;
75 	  else            h2 = (h - 0xb1) *2 +1;
76 	  if( l >= 0x80 ) l2 = l - 0x1f -1;
77 	  else            l2 = l - 0x1f;
78 	}else{
79 	  if( h <= 0x9f ) h2 = (h - 0x70) *2;
80 	  else            h2 = (h - 0xb0) *2;
81 	  l2 = l - 0x7e;
82 	}
83 	*euc_p++ = 0x80 | h2;
84 	*euc_p++ = 0x80 | l2;
85 
86       }else{
87 	break;
88       }
89 
90     }
91   }
92 
93   *euc_p = '\0';
94 }
95 
96 
97 /*===========================================================================
98  * EUC �� SJIS ���Ѵ� (���ʤ�Ŭ��)
99  *	*euc_p ��ʸ����� SJIS ���Ѵ����ơ�*sjis_p �˳�Ǽ���롣
100  *
101  *	��ա��ˤ��δؿ��ϡ��Хåե����դ������å����Ƥ��ʤ���
102  *		*sjis_p �ϡ�*euc_p ��Ʊ���ʾ��Ĺ�����ʤ��ȴ�
103  *===========================================================================*/
104 
euc2sjis(char * sjis_p,const char * euc_p)105 void	euc2sjis( char *sjis_p, const char *euc_p )
106 {
107   int	h,l;
108 
109   while( ( h = (unsigned char)*euc_p++ ) ){
110 
111     if( h < 0x80 ){				/* ASCII */
112 
113       *sjis_p ++ = h;
114 
115     }else if( h==0x8e ){			/* Ⱦ�ѥ��� */
116 
117       if( ( h = (unsigned char)*euc_p++ ) ){
118 
119 	if( 0xa1 <= h && h <= 0xdf )
120 	  *sjis_p ++ = h;
121 
122       }else{
123 	break;
124       }
125 
126     }else if( h & 0x80 ){			/* ����ʸ�� */
127 
128       if( ( l = (unsigned char)*euc_p++ ) ){
129 
130 	if( l & 0x80 ){
131 
132 	  h = (h & 0x7f) - 0x21;
133 	  l = (l & 0x7f) - 0x21;
134 
135 	  if( h & 0x01 ) l += 0x9e;
136 	  else           l += 0x40;
137 	  if( l >= 0x7f ) l += 1;
138 
139 	  h = (h>>1) + 0x81;
140 
141 	  if( h >= 0xa0 ) h += 0x40;
142 
143 	  *sjis_p++ = h;
144 	  *sjis_p++ = l;
145 
146 	}
147 
148       }else{
149 	break;
150       }
151 
152     }
153   }
154 
155   *sjis_p = '\0';
156 }
157 
158 
159 /*===========================================================================
160  * EUCʸ�����Ĺ����׻� (���ä���Ŭ��)
161  *	ASCII��Ⱦ�ѥ��ʤ�1ʸ�������Ѵ�����2ʸ���Ȥ��롣
162  *	ʸ�������Ρ�\0 ��Ĺ���˴ޤ�ʤ���
163  *===========================================================================*/
164 
euclen(const char * euc_p)165 int	euclen( const char *euc_p )
166 {
167   int	i = 0, h;
168 
169   while( ( h = (unsigned char)*euc_p++ ) ){
170 
171     if( h < 0x80 ){				/* ASCII */
172 
173       i++;
174 
175     }else if( h == 0x8e ){			/* Ⱦ�ѥ��� */
176 
177       euc_p ++;
178       i++;
179 
180     }else{					/* ���� */
181 
182       euc_p ++;
183       i += 2;
184 
185     }
186   }
187 
188   return i;
189 }
190 
191 /*===========================================================================
192  * ʸ���� src ��ȡ������ʬ�䤹�롣
193  *	���ڤ�ʸ���ϡ����ڡ����ȥ��֡���Ƭ�Υ��ڡ��������֤�̵�뤵��롣
194  *	ʬ�䤷���ȡ������ ( \0 ���ղä��� ) dst �˥��ԡ�����
195  *	src �λĤ��ʸ������ʬ����Ƭ���ɥ쥹���֤���
196  *	����ʾ�ʬ��Ǥ��ʤ����� dst �ˤ� "\0" ���ԡ�����NULL���֤���
197  *
198  *	�ȡ������ʬ�䤹��ݤΥ롼��
199  *	  �� ����(\r or \n) �ʤ��� ��ü(\0) ��ʸ����Ͻ����Ȥߤʤ���
200  *	���̤�ʸ��
201  *	  �� ���ڡ����ȥ��֤ϡ����ڤ�ʸ���Ȥ���
202  *	  �� # �ϥ�����ʸ���Ȥ�����üʸ����Ʊ�ͤ˰�����
203  *	  �� \ �ϥ���������ʸ���Ȥ��롣���ڡ��������֡�#��"��\ ������ \ ��
204  *	     �����硢���������̤�ʸ���Ȥ������̾��ʸ����Ʊ�ͤ˰�����
205  *	     ¾��ʸ�������� \ �������硢ñ�� \ �ϥ����åפ���롣
206  *	  �� " �ϰ�����ʸ���Ȥ��롣����ʸ���ǰϤޤ줿��ʬ��ʸ����ˤĤ��ơ�
207  *	     ���ڡ��������֡�#��\ �����̤�ʸ���Ȥߤʤ���ʤ���
208  *	     �������� "" ��2ʸ����³���Ƥ�����˸¤ꡢ" �Ȥߤʤ���
209  *===========================================================================*/
210 #define	COMMENT		'#'
211 #define	ESCAPE		'\\'
212 #define	QUOTE		'\"'
my_strtok(char * dst,char * src)213 char	*my_strtok( char *dst, char *src )
214 {
215   char *p = &src[0];
216   char *q = &dst[0];
217 
218   int esc   = FALSE;			/* ���������ץ������������� */
219   int quote = FALSE;			/* ��������ʸ��������         */
220 
221   *q = '\0';
222 
223   while( *p==' ' || *p=='\t' ){		/* ��Ƭ�Υ��ڡ��������֤����å� */
224     p ++;
225   }
226 
227   while(1){
228 
229     if( quote == FALSE ){		/* �̾���ʬ�ν��� */
230 
231       if( esc == FALSE ){
232 	if     ( *p=='\0' ||
233 		 *p=='\r' ||
234 		 *p=='\n' ||
235 		 *p==' '  ||
236 		 *p=='\t' ||
237 		 *p==COMMENT ){ *q = '\0';   break; }
238 	else if( *p==QUOTE   ){         p++; quote = TRUE; }
239 	else if( *p==ESCAPE  ){         p++; esc = TRUE;   }
240 	else                  { *q++ = *p++;               }
241       }else{
242 	if     ( *p=='\0' ||
243 		 *p=='\r' ||
244 		 *p=='\n' )   { *q = '\0'; break; }
245 	else                  { *q++ = *p++; esc = FALSE;  }
246       }
247 
248     }else{				/* " " �ǰϤޤ줿��ʬ�ν��� */
249 
250 	if     ( *p=='\0' ||
251 		 *p=='\r' ||
252 		 *p=='\n'   ){ *q = '\0';   break; }
253 	else if( *p==QUOTE  )
254 	  if( *(p+1)==QUOTE ){ *q++ = QUOTE; p+=2; quote = FALSE; }
255 	  else               {               p++;  quote = FALSE; }
256 	else                 { *q++ = *p++;                }
257 
258     }
259   }
260 
261   if( *dst == '\0' ) return NULL;
262   else               return p;
263 }
264