GadgetSeed  0.9.6
str.c
[詳解]
1 /** @file
2  @brief 文字列処理
3 
4  @date 2017.11.30
5  @date 2002.03.02
6  @author Takashi SHUDO
7 
8  @page string_handring 文字列処理
9 
10  GadgetSeedは独自の文字列処理APIがあります。
11 
12  GadgetSeedは半角文字を unsigned char として処理します。\n
13  これは @ref uchar と定義されています。
14 
15  文字列処理は str.h で定義されています。
16 
17  内部の文字コードは UTF-8 としています。\n
18  文字コード処理は @ref character_code を参照して下さい。
19 
20  @section hex_string_api 16進数文字列変換API
21 
22  include ファイル : str.h
23 
24  | API名 | 機能 |
25  |:------------------|:----------------------|
26  | itohs() | @copybrief itohs |
27  | lltohs() | @copybrief lltohs |
28  | hstoi() | @copybrief hstoi |
29  | hstou() | @copybrief hstou |
30 
31  @section dec_string_api 10進数文字列変換API
32 
33  include ファイル : str.h
34 
35  | API名 | 機能 |
36  |:------------------|:----------------------|
37  | itods() | @copybrief itods |
38  | lltods() | @copybrief lltods |
39  | uitods() | @copybrief uitods |
40  | ulltods() | @copybrief ulltods |
41  | itodsz() | @copybrief itodsz |
42  | lltodsz() | @copybrief lltodsz |
43  | uitodsz() | @copybrief uitodsz |
44  | ulltodsz() | @copybrief ulltodsz |
45  | dstoi() | @copybrief dstoi |
46  | dstou() | @copybrief dstou |
47 
48  @section string_api 文字列処理API
49 
50  include ファイル : str.h
51 
52  | API名 | 機能 |
53  |:------------------|:----------------------|
54  | strcomp() | @copybrief strcomp |
55  | strncomp() | @copybrief strncomp |
56  | strncopy() | @copybrief strncopy |
57  | strleng() | @copybrief strleng |
58  | str2cap() | @copybrief str2cap |
59  | hdstoi() | @copybrief hdstoi |
60  | hdstou() | @copybrief hdstou |
61  | memoryset() | @copybrief memoryset |
62  | memorycopy() | @copybrief memorycopy |
63  | strchar() | @copybrief strchar |
64 */
65 
66 #include "str.h"
67 
68 /*
69  * 16進数文字列変換
70  */
71 
72 /**
73  @brief intを16進数字列変換
74 
75  valをstrlen桁の16進数字列へ変換してstrへ出力
76 
77  @param[out] str 出力文字列ポインタ
78  @param[in] val 文字列にする値
79  @param[in] strlen 出力文字数(0-8)
80 
81  @return 出力文字列ポインタ
82 */
83 uchar * itohs(uchar *str, unsigned int strlen, int val)
84 {
85  unsigned int i;
86  unsigned int mask = (unsigned int)(0xf0000000>>((8-strlen)*4));
87  unsigned int tmp;
88 
89  for(i=0; i<strlen; i++) {
90  tmp = (val & mask) >> ((strlen-1-i)<<2);
91  if(tmp < 10) {
92  *str = tmp + '0';
93  } else {
94  *str = tmp - 10 + 'a';
95  }
96  str ++;
97  mask >>= 4;
98  }
99  *str = 0;
100 
101  return str;
102 }
103 
104 /**
105  @brief long long 16進数字列変換
106 
107  valをstrlen桁の16進数字列へ変換してstrへ出力
108 
109  @param[out] str 出力文字列ポインタ
110  @param[in] val 文字列にする値
111  @param[in] strlen 出力文字数(0-8)
112 
113  @return 出力文字列ポインタ
114 */
115 uchar * lltohs(uchar *str, unsigned int strlen, long long val)
116 {
117  unsigned int i;
118  unsigned long long mask = (unsigned long long)(0xf000000000000000>>((16-strlen)*4));
119  unsigned long long tmp;
120 
121  for(i=0; i<strlen; i++) {
122  tmp = (val & mask) >> ((strlen-1-i)<<2);
123  if(tmp < 10) {
124  *str = (unsigned char)(tmp + '0');
125  } else {
126  *str = (unsigned char)(tmp - 10 + 'a');
127  }
128  str ++;
129  mask >>= 4;
130  }
131  *str = 0;
132 
133  return str;
134 }
135 
136 /**
137  @brief 16進数文字列 int 変換
138 
139  strの16進数文字列8文字からintへ変換
140 
141  @param[in] str 16進数文字列
142 
143  @return 変換した値
144 */
145 int hstoi(uchar *str)
146 {
147  int rt = 0;
148 
149  while(*str != 0) {
150  rt <<= 4;
151  if((('0' <= *str) && (*str <= '9'))
152  || (('A' <= *str) && (*str <= 'F'))
153  || (('a' <= *str) && (*str <= 'f'))) {
154  if(('0' <= *str) && (*str <= '9')) {
155  rt += *str - '0';
156  } else if(('A' <= *str) && (*str <= 'F')) {
157  rt += *str - 'A' + 10;
158  } else if(('a' <= *str) && (*str <= 'f')) {
159  rt += *str - 'a' + 10;
160  }
161  }
162  str ++;
163  if(*str == ';') { // !!!
164  break;
165  }
166  }
167 
168  return rt;
169 }
170 
171 /**
172  @brief 16進数文字列 unsigned int 変換
173 
174  strの16進数文字列8文字からunsigned intへ変換
175 
176  @param[in] str 16進数文字列
177 
178  @return 変換した値
179 */
180 unsigned int hstou(uchar *str)
181 {
182  unsigned int rt = 0;
183 
184  while(*str != 0) {
185  rt <<= 4;
186  if((('0' <= *str) && (*str <= '9'))
187  || (('A' <= *str) && (*str <= 'F'))
188  || (('a' <= *str) && (*str <= 'f'))) {
189  if(('0' <= *str) && (*str <= '9')) {
190  rt += *str - '0';
191  } else if(('A' <= *str) && (*str <= 'F')) {
192  rt += *str - 'A' + 10;
193  } else if(('a' <= *str) && (*str <= 'f')) {
194  rt += *str - 'a' + 10;
195  }
196  }
197  str ++;
198  if(*str == ';') { // !!!
199  break;
200  }
201  }
202 
203  return rt;
204 }
205 
206 /**
207  @brief int 10進数文字列変換
208 
209  valをstrlen桁の10進数文字列に変換してstrへ出力
210 
211  @param[out] str 10進数文字列
212  @param[in] strlen 桁数
213  @param[in] val 変換する値
214 
215  @return 変換した文字列ポインタ
216 */
217 uchar * itods(uchar *str, unsigned int strlen, int val)
218 {
219  unsigned int i, j;
220  int m = 0;
221 
222  if(val < 0) {
223  val = 0-val;
224  m = 1;
225  }
226 
227  for(i=0; i<strlen; i++) {
228  if(val == 0) {
229  if(i == 0) {
230  str[strlen-1-i] = (uchar)'0';
231  i++;
232  }
233  for(j=0; j<(strlen-i); j++) {
234  str[j] = (uchar)' ';
235  }
236  if(m) {
237  if((int)((int)strlen-i-1) >= 0) {
238  str[strlen-i-1] = (uchar)'-';
239  }
240  }
241  goto end;
242  }
243  str[strlen-1-i] = (uchar)((val % 10) + '0');
244  val /= 10;
245  }
246 
247  end:
248  str[strlen] = 0;
249 
250  return str;
251 }
252 
253 /**
254  @brief long long 10進数文字列変換
255 
256  valをstrlen桁の10進数文字列に変換してstrへ出力
257 
258  @param[out] str 10進数文字列
259  @param[in] strlen 桁数
260  @param[in] val 変換する値
261 
262  @return 変換した文字列ポインタ
263 */
264 uchar * lltods(uchar *str, unsigned int strlen, long long val)
265 {
266  unsigned int i, j;
267  int m = 0;
268 
269  if(val < 0) {
270  val = 0-val;
271  m = 1;
272  }
273 
274  for(i=0; i<strlen; i++) {
275  if(val == 0) {
276  if(i == 0) {
277  str[strlen-1-i] = (uchar)'0';
278  i++;
279  }
280  for(j=0; j<(strlen-i); j++) {
281  str[j] = (uchar)' ';
282  }
283  if(m) {
284  if((int)((int)strlen-i-1) >= 0) {
285  str[strlen-i-1] = (uchar)'-';
286  }
287  }
288  goto end;
289  }
290  str[strlen-1-i] = (uchar)((val % 10) + '0');
291  val /= 10;
292  }
293 
294  end:
295  str[strlen] = 0;
296 
297  return str;
298 }
299 
300 /**
301  @brief unsigned int 10進数文字列変換
302 
303  valをstrlen桁の10進数文字列に変換してstrへ出力(符号無し)
304 
305  @param[out] str 10進数文字列
306  @param[in] strlen 桁数
307  @param[in] val 変換する値
308 
309  @return 変換した文字列ポインタ
310 */
311 uchar * uitods(uchar *str, unsigned int strlen, unsigned int val)
312 {
313  unsigned int i, j;
314 
315  for(i=0; i<strlen; i++) {
316  if(val == 0) {
317  if(i == 0) {
318  str[strlen-1-i] = (uchar)'0';
319  i++;
320  }
321  for(j=0; j<(strlen-i); j++) {
322  str[j] = (uchar)' ';
323  }
324  goto end;
325  }
326  str[strlen-1-i] = (uchar)((val % 10) + '0');
327  val /= 10;
328  }
329 
330  end:
331  str[strlen] = 0;
332 
333  return str;
334 }
335 
336 /**
337  @brief unsigned long long 10進数文字列変換
338 
339  valをstrlen桁の10進数文字列に変換してstrへ出力(符号無し)
340 
341  @param[out] str 10進数文字列
342  @param[in] strlen 桁数
343  @param[in] val 変換する値
344 
345  @return 変換した文字列ポインタ
346 */
347 uchar * ulltods(uchar *str, unsigned int strlen, unsigned long long val)
348 {
349  unsigned int i, j;
350 
351  for(i=0; i<strlen; i++) {
352  if(val == 0) {
353  if(i == 0) {
354  str[strlen-1-i] = (uchar)'0';
355  i++;
356  }
357  for(j=0; j<(strlen-i); j++) {
358  str[j] = (uchar)' ';
359  }
360  goto end;
361  }
362  str[strlen-1-i] = (uchar)((val % 10) + '0');
363  val /= 10;
364  }
365 
366  end:
367  str[strlen] = 0;
368 
369  return str;
370 }
371 
372 /**
373  @brief int "0"付き10進数文字列変換
374 
375  valをstrlen桁の10進数文字列に変換してstrへ出力("0"付き)
376 
377  @param[out] str 10進数文字列
378  @param[in] strlen 桁数
379  @param[in] val 変換する値
380 
381  @return 変換した文字列ポインタ
382 */
383 uchar * itodsz(uchar *str, unsigned int strlen, int val)
384 {
385  unsigned int i, j;
386 
387  if(val < 0) {
388  val = 0-val;
389  str[0] = (uchar)'-';
390  } else {
391  str[0] = (uchar)'0';
392  }
393 
394  for(i=0; i<strlen; i++) {
395  if(val == 0) {
396  for(j=1; j<(strlen-i); j++) {
397  str[j] = (uchar)'0';
398  }
399  goto end;
400  }
401  str[strlen-1-i] = (uchar)((val % 10) + '0');
402  val /= 10;
403  }
404 
405  end:
406  str[strlen] = 0;
407 
408  return str;
409 }
410 
411 /**
412  @brief long long 10進数文字列変換
413 
414  valをstrlen桁の10進数文字列に変換してstrへ出力("0"付き)
415 
416  @param[out] str 10進数文字列
417  @param[in] strlen 桁数
418  @param[in] val 変換する値
419 
420  @return 変換した文字列ポインタ
421 */
422 uchar * lltodsz(uchar *str, unsigned int strlen, long long val)
423 {
424  unsigned int i, j;
425 
426  if(val < 0) {
427  val = 0-val;
428  str[0] = (uchar)'-';
429  } else {
430  str[0] = (uchar)'0';
431  }
432 
433  for(i=0; i<strlen; i++) {
434  if(val == 0) {
435  for(j=1; j<(strlen-i); j++) {
436  str[j] = (uchar)'0';
437  }
438  goto end;
439  }
440  str[strlen-1-i] = (uchar)((val % 10) + '0');
441  val /= 10;
442  }
443 
444  end:
445  str[strlen] = 0;
446 
447  return str;
448 }
449 
450 /**
451  @brief unsigned int 符号なし"0"付き10進数文字列変換
452 
453  valをstrlen桁の10進数文字列に変換してstrへ出力("0"付き,符号無し)
454 
455  @param[out] str 10進数文字列
456  @param[in] strlen 桁数
457  @param[in] val 変換する値
458 
459  @return 変換した文字列ポインタ
460 */
461 uchar * uitodsz(uchar *str, unsigned int strlen, unsigned int val)
462 {
463  unsigned int i, j;
464 
465  for(i=0; i<strlen; i++) {
466  if(val == 0) {
467  for(j=0; j<(strlen-i); j++) {
468  str[j] = (uchar)'0';
469  }
470  goto end;
471  }
472  str[strlen-1-i] = (val % 10) + (uchar)'0';
473  val /= 10;
474  }
475 
476  end:
477  str[strlen] = 0;
478 
479  return str;
480 }
481 
482 /**
483  @brief unsigned long long 符号なし"0"付き10進数文字列変換
484 
485  valをstrlen桁の10進数文字列に変換してstrへ出力("0"付き,符号無し)
486 
487  @param[out] str 10進数文字列
488  @param[in] strlen 桁数
489  @param[in] val 変換する値
490 
491  @return 変換した文字列ポインタ
492 */
493 uchar * ulltodsz(uchar *str, unsigned int strlen, unsigned long long val)
494 {
495  unsigned int i, j;
496 
497  for(i=0; i<strlen; i++) {
498  if(val == 0) {
499  for(j=0; j<(strlen-i); j++) {
500  str[j] = (uchar)'0';
501  }
502  goto end;
503  }
504  str[strlen-1-i] = (uchar)((val % 10) + '0');
505  val /= 10;
506  }
507 
508  end:
509  str[strlen] = 0;
510 
511  return str;
512 }
513 
514 /**
515  @brief 10進数文字列 int 変換
516 
517  strの10進数文字列からintへ変換
518 
519  @param[in] str - 10進数文字列
520 
521  @return 変換した値
522 */
523 int dstoi(uchar *str)
524 {
525  int rt = 0;
526  char m = 0;
527 
528  while(*str != 0) {
529  if(*str == '-') {
530  m = 1;
531  }
532  rt *= 10;
533  if(('0' <= *str) && (*str <= '9')) {
534  rt += *str - '0';
535  }
536  str ++;
537  if(*str == ';') {
538  break;
539  }
540  }
541 
542  if(m != 0) {
543  rt = 0-rt;
544  }
545 
546  return rt;
547 }
548 
549 /**
550  @brief 10進数文字列 unsigned int 変換
551 
552  strの10進数文字列からunsigned intへ変換
553 
554  @param[in] str - 10進数文字列
555 
556  @return 変換した値
557 */
558 unsigned int dstou(uchar *str)
559 {
560  unsigned int rt = 0;
561 
562  while(*str != 0) {
563  rt *= 10;
564  if(('0' <= *str) && (*str <= '9')) {
565  rt += *str - '0';
566  }
567  str ++;
568  if(*str == ';') {
569  break;
570  }
571  }
572 
573  return rt;
574 }
575 
576 /**
577  @brief 文字列比較
578 
579  文字列s1とs2を比較して結果を返す
580 
581  @return 0:同じ -1:*s1<*s2 1:*s1>*s2
582 */
583 int strcomp(const uchar *s1, const uchar *s2)
584 {
585  do {
586  if(*s1 > *s2) {
587  return 1;
588  } else if(*s1 < *s2) {
589  return -1;
590  }
591  s1 ++;
592  s2 ++;
593  } while((*s1 != 0) || (*s2 != 0));
594 
595  return 0;
596 }
597 
598 /**
599  @brief 文字列比較(長さ指定あり)
600 
601  文字列s1とs2をn文字分比較して結果を返す
602 
603  @return 0:同じ -1:*s1<*s2 1:*s1>*s2
604 */
605 int strncomp(const uchar *s1, const uchar *s2, unsigned int n)
606 {
607  while(n) {
608  if(*s1 > *s2) {
609  return 1;
610  } else if(*s1 < *s2) {
611  return -1;
612  }
613  s1 ++;
614  s2 ++;
615  n --;
616  }
617 
618  return 0;
619 }
620 
621 /**
622  @brief 文字列コピー
623 
624  文字列srcをdestへn文字分コピー
625 
626  @param[out] dest コピー先文字列ポインタ
627  @param[in] src コピー元文字列ポインタ
628  @param[in] n コピーする文字のバイト数
629 
630  @return コピー先文字列ポインタ
631 */
632 uchar * strncopy(uchar *dest, const uchar *src, unsigned int n)
633 {
634  while(n) {
635  if(*src == 0) {
636  break;
637  }
638  *dest = *src;
639  dest ++;
640  src ++;
641  n --;
642  }
643  *dest = 0;
644 
645  return dest;
646 }
647 
648 /**
649  @brief 文字列長
650 
651  文字列strの長さを返す
652 
653  @param[in] str 文字列のポインタ
654 
655  @return 文字列のバイト数
656 */
657 unsigned int strleng(const uchar *str)
658 {
659  unsigned int len = 0;
660 
661  while((*str) != 0) {
662  len ++;
663  str ++;
664  }
665 
666  return len;
667 }
668 
669 /**
670  @brief 小文字から大文字へ変換
671 
672  文字列strの小文字を大文字にする
673 
674  @param[in] str 文字列のポインタ
675 
676  @return 変換した文字列のポインタ
677 */
679 {
680  uchar *p = str;
681  while((*str) != 0) {
682  if(('a' <= *str) && (*str <= 'z')) {
683  *str -= ('a' - 'A');
684  }
685  str ++;
686  }
687 
688  return p;
689 }
690 
691 /**
692  @brief 10進数または16進数文字列 int 変換
693 
694  文字列の最初が"#"の場合strの10進数文字列からintへ変換
695  それ以外strの16進数文字列8文字からintへ変換
696 
697  @param[in] str 文字列のポインタ
698 
699  @return 変換した値
700 */
701 int hdstoi(uchar *str)
702 {
703  if(*str == '#') {
704  return dstoi(&str[1]);
705  } else {
706  return hstoi(str);
707  }
708 }
709 
710 /**
711  @brief 10進数または16進数文字列 unsigned int 変換
712 
713  文字列の最初が"#"の場合strの10進数文字列からunsigned intへ変換
714  それ以外strの16進数文字列8文字からunsigned intへ変換
715 
716  @param[in] str 文字列のポインタ
717 
718  @return 変換した値
719 */
720 unsigned int hdstou(uchar *str)
721 {
722  if(*str == '#') {
723  return dstou(&str[1]);
724  } else {
725  return hstou(str);
726  }
727 }
728 
729 /**
730  @brief メモリを任意の値に設定
731 
732  @param[out] dest 値を設定されるメモリのポインタ
733  @param[in] data 設定する値
734  @param[in] count 設定するバイト数
735 
736  @return 値が設定されたメモリのポインタ
737 */
738 void * memoryset(void *dest, uchar data, unsigned int count)
739 {
740  uchar *p = dest;
741 
742  while(count) {
743  *p = data;
744  p ++;
745  count --;
746  }
747 
748  return dest;
749 }
750 
751 /**
752  @brief メモリコピー
753 
754  @param[out] dest コピー先メモリのポインタ
755  @param[in] src コピー元メモリのポインタ
756  @param[in] count 設定するバイト数
757 
758  @return コピー先メモリのポインタ
759 */
760 void * memorycopy(void *dest, const void *src, unsigned int count)
761 {
762  uchar *d = dest;
763  uchar *s = (uchar *)src;
764 
765  while(count) {
766  *d = *s;
767  d ++;
768  s ++;
769  count --;
770  }
771 
772  return dest;
773 }
774 
775 /**
776  @brief 文字を検索
777 
778  @param[in] str 検索対象文字列
779  @param[in] ch 検出する文字
780 
781  @return 検索した文字のポインタ
782 */
783 uchar *strchar(const uchar *str, uchar ch)
784 {
785  const uchar *p = str;
786 
787  while(*p != 0) {
788  if(*p == 0) {
789  return 0;
790  } else if(*p == ch) {
791  return (uchar *)p;
792  }
793 
794  p ++;
795  }
796 
797  return 0;
798 }
uchar * itods(uchar *str, unsigned int strlen, int val)
int 10進数文字列変換
Definition: str.c:217
unsigned char uchar
GadgetSeedの文字(列)は unsigned char 型となる
Definition: str.h:13
uchar * lltodsz(uchar *str, unsigned int strlen, long long val)
long long 10進数文字列変換
Definition: str.c:422
uchar * itodsz(uchar *str, unsigned int strlen, int val)
int "0"付き10進数文字列変換
Definition: str.c:383
uchar * ulltods(uchar *str, unsigned int strlen, unsigned long long val)
unsigned long long 10進数文字列変換
Definition: str.c:347
int strncomp(const uchar *s1, const uchar *s2, unsigned int n)
文字列比較(長さ指定あり)
Definition: str.c:605
void * memoryset(void *dest, uchar data, unsigned int count)
メモリを任意の値に設定
Definition: str.c:738
unsigned int hdstou(uchar *str)
10進数または16進数文字列 unsigned int 変換
Definition: str.c:720
int dstoi(uchar *str)
10進数文字列 int 変換
Definition: str.c:523
uchar * str2cap(uchar *str)
小文字から大文字へ変換
Definition: str.c:678
int hstoi(uchar *str)
16進数文字列 int 変換
Definition: str.c:145
文字列処理
uchar * strchar(const uchar *str, uchar ch)
文字を検索
Definition: str.c:783
uchar * ulltodsz(uchar *str, unsigned int strlen, unsigned long long val)
unsigned long long 符号なし"0"付き10進数文字列変換
Definition: str.c:493
uchar * uitods(uchar *str, unsigned int strlen, unsigned int val)
unsigned int 10進数文字列変換
Definition: str.c:311
int strcomp(const uchar *s1, const uchar *s2)
文字列比較
Definition: str.c:583
void * memorycopy(void *dest, const void *src, unsigned int count)
メモリコピー
Definition: str.c:760
uchar * itohs(uchar *str, unsigned int strlen, int val)
intを16進数字列変換
Definition: str.c:83
uchar * strncopy(uchar *dest, const uchar *src, unsigned int n)
文字列コピー
Definition: str.c:632
unsigned int strleng(const uchar *str)
文字列長
Definition: str.c:657
uchar * lltods(uchar *str, unsigned int strlen, long long val)
long long 10進数文字列変換
Definition: str.c:264
unsigned int dstou(uchar *str)
10進数文字列 unsigned int 変換
Definition: str.c:558
unsigned int hstou(uchar *str)
16進数文字列 unsigned int 変換
Definition: str.c:180
uchar * uitodsz(uchar *str, unsigned int strlen, unsigned int val)
unsigned int 符号なし"0"付き10進数文字列変換
Definition: str.c:461
uchar * lltohs(uchar *str, unsigned int strlen, long long val)
long long 16進数字列変換
Definition: str.c:115
int hdstoi(uchar *str)
10進数または16進数文字列 int 変換
Definition: str.c:701