JunkBox_Lib++ (for Windows) 1.10.1
Loading...
Searching...
No Matches
tools.cpp
Go to the documentation of this file.
1
8#ifdef CPLUSPLUS
9 #undef CPLUSPLUS
10#endif
11
12
13#include "tools.h"
14#include "jbxl_state.h"
15
16
19
22
23unsigned long int UsedMemoryBase = 0;
24
25//
26unsigned char LocalIPNum[4] = {0x7f, 0x00, 0x00, 0x01};
27unsigned char LocalIPNum6[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
28
29
31//
32
33// case of C++, isNull() is inline
34
35#ifndef CPLUSPLUS
36
51int isNull(void* p)
52{
53 if (p==NULL) return TRUE;
54
55#ifdef WIN32
56 if (p==WIN_DD_NULL) return TRUE;
57#endif
58
59 return FALSE;
60}
61
62#endif
63
64
66//
67
81{
82 unsigned char x[] = {0x01, 0x00};
83
84 if (HostEndian==LITTLE_ENDIAN) return TRUE;
85
86 else if (HostEndian==BIG_ENDIAN) return FALSE;
87
88 else {
89 unsigned short* xx = (unsigned short*)x;
90 if (*xx==1) {
92 return TRUE;
93 }
94 else {
96 return FALSE;
97 }
98 }
99}
100
101
115{
116 unsigned char x[] = {0x00, 0x01};
117
118 if (HostEndian==BIG_ENDIAN) return TRUE;
119
120 else if (HostEndian==LITTLE_ENDIAN) return FALSE;
121
122 else {
123 unsigned short* xx = (unsigned short*)x;
124 if (*xx==1) {
126 return TRUE;
127 }
128 else {
130 return FALSE;
131 }
132 }
133}
134
135
143void check_endian(void)
144{
146}
147
148
157{
158 double ret = *((double*)ptr);
159
161 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 8);
162 return ret;
163}
164
165
175{
176 float ret = *((float*)ptr);
177
179 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 4);
180 return ret;
181}
182
183
193{
194 int ret = *((int*)ptr);
195
197 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 4);
198 return ret;
199}
200
201
210unsigned int uint_from_little_endian(void* ptr)
211{
212 unsigned int ret = *((unsigned int*)ptr);
213
215 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 4);
216 return ret;
217}
218
219
229{
230 short ret = *((short*)ptr);
231
233 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 2);
234 return ret;
235}
236
237
246unsigned short ushort_from_little_endian(void* ptr)
247{
248 unsigned short ret = *((unsigned short*)ptr);
249
251 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 2);
252 return ret;
253}
254
255
264double double_from_big_endian(void* ptr)
265{
266 double ret = *((double*)ptr);
267
269 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 8);
270 return ret;
271}
272
273
282float float_from_big_endian(void* ptr)
283{
284 float ret = *((float*)ptr);
285
287 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 4);
288 return ret;
289}
290
291
301{
302 int ret = *((int*)ptr);
303
305 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 4);
306 return ret;
307}
308
309
318unsigned int uint_from_big_endian(void* ptr)
319{
320 int ret = *((unsigned int*)ptr);
321
323 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 4);
324 return ret;
325}
326
327
336short short_from_big_endian(void* ptr)
337{
338 short ret = *((short*)ptr);
339
341 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 2);
342 return ret;
343}
344
345
354unsigned short ushort_from_big_endian(void* ptr)
355{
356 unsigned short ret = *((unsigned short*)ptr);
357
359 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 2);
360 return ret;
361}
362
363
365// Time
366
367//char _Local_Time[64]; ///< 作業用(ローカルタイム)
368
369
386/*
387char* get_localtime(char c1, char c2, char c3, char c4)
388{
389 struct tm* pt;
390 time_t tm;
391
392 tm = time(NULL);
393 pt = localtime(&tm);
394
395 snprintf(_Local_Time, 63, "%04d%c%02d%c%02d%c%02d%c%02d%c%02d%c",
396 pt->tm_year+1900, c1, pt->tm_mon+1, c1, pt->tm_mday, c2,
397 pt->tm_hour, c3, pt->tm_min, c3, pt->tm_sec, c4);
398
399 return _Local_Time;
400}
401*/
402
403
414/*
415char* get_localtime_ts(char c1, char c2, char c3, char c4)
416{
417 struct tm* pt;
418 time_t tm;
419 char* local_tm = NULL;
420
421 local_tm = (char*)malloc(64);
422 if (local_tm==NULL) return NULL;
423 memset(local_tm, 0, 64);
424
425 tm = time(NULL);
426 pt = localtime(&tm);
427
428 snprintf(local_tm, 63, "%04d%c%02d%c%02d%c%02d%c%02d%c%02d%c",
429 pt->tm_year+1900, c1, pt->tm_mon+1, c1, pt->tm_mday, c2,
430 pt->tm_hour, c3, pt->tm_min, c3, pt->tm_sec, c4);
431
432 return local_tm;
433}
434*/
435
436
437// 要 free
438// char* ltime = get_local_timestamp(time(0), "%Y/%m/%dT%H:%M:%SZ")
439//
440char* get_local_timestamp(time_t date, const char* format)
441{
442 char* buf = (char*)malloc(64);
443 memset(buf, 0, 64);
444
445 //struct tm tm = *gmtime(&date);
446 struct tm tm = *localtime(&date);
447 strftime(buf, 63, format, &tm);
448
449 return buf;
450}
451
452
453// 要 free
454char* get_gmt_timestamp(time_t date, const char* format)
455{
456 char* buf = (char*)malloc(64);
457 memset(buf, 0, 64);
458
459 struct tm tm = *gmtime(&date);
460 //struct tm tm = *localtime(&date);
461 strftime(buf, 63, format, &tm);
462
463 return buf;
464}
465
466
468
484char* get_line(char* buf, int n)
485{
486 int i, j, pos, cnt;
487 char* ret = NULL;
488
489 if (buf==NULL) return NULL;
490
491 for(i=0,j=0; j<n-1; j++) {
492 while (buf[i]!=CHAR_LF && buf[i]!=CHAR_CR && buf[i]!='\0') i++;
493 while (buf[i]==CHAR_LF || buf[i]==CHAR_CR) i++;
494 }
495 if (buf[i]=='\0') return NULL;
496
497 pos = i;
498 while (buf[i]!=CHAR_LF && buf[i]!=CHAR_CR && buf[i]!='\0') i++;
499 cnt = i - pos;
500
501 if (cnt>=0) {
502 ret = (char*)malloc(cnt+1);
503 if (ret==NULL) return NULL;
504
505 for(i=0; i<cnt; i++) ret[i] = buf[pos+i];
506 ret[cnt] = '\0';
507 }
508 return ret;
509}
510
511
529char* get_seq_data(char* buf, int* ptr)
530{
531 int pos, cnt;
532 char* ret = NULL;
533
534 if (buf==NULL || buf[*ptr]=='\0') return NULL;
535
536 pos = *ptr;
537 while (buf[*ptr]!=CHAR_LF && buf[*ptr]!=CHAR_CR && buf[*ptr]!='\0') (*ptr)++;
538 cnt = *ptr - pos;
539
540 if (cnt>=0) {
541 ret = (char*)malloc(cnt+1);
542 if (ret==NULL) return NULL;
543
544 int i;
545 for(i=0; i<cnt; i++) ret[i] = buf[pos+i];
546 ret[cnt] = '\0';
547 }
548
549 while (buf[*ptr]==CHAR_LF || buf[*ptr]==CHAR_CR) (*ptr)++;
550 return ret;
551}
552
553
567char* awk(char* buf, char cc, int n)
568{
569 int i, j, pos, cnt;
570 char* item = NULL;
571
572 if (buf==NULL) return NULL;
573
574 for(i=0,j=0; j<n-1; j++) {
575 while (buf[i]!='\0' && buf[i]!=cc) i++;
576 if (buf[i]==cc) i++;
577 }
578 if (buf[i]=='\0') return NULL;
579
580 pos = i;
581 while (buf[i]!='\0' && buf[i]!=cc) i++;
582 cnt = i - pos;
583
584 item = (char*)malloc(cnt+1);
585 if (item==NULL) return NULL;
586
587 for (i=0; i<cnt; i++) item[i] = buf[pos+i];
588 item[cnt] = '\0';
589
590 return item;
591}
592
593
609char* cawk(char* buf, char cc, int n)
610{
611 int i, j, pos, cnt;
612 char* item = NULL;
613
614 if (buf==NULL) return NULL;
615
616 for(i=0,j=0; j<n-1; j++) {
617 while (buf[i]!='\0' && buf[i]!=cc) i++;
618 while (buf[i]!='\0' && buf[i]==cc) i++;
619 }
620 if (buf[i]=='\0') return NULL;
621
622 pos = i;
623 while (buf[i]!='\0' && buf[i]!=cc) i++;
624 cnt = i - pos;
625
626 item = (char*)malloc(cnt+1);
627 if (item==NULL) return NULL;
628
629 for (i=0; i<cnt; i++) item[i] = buf[pos+i];
630 item[cnt] = '\0';
631
632 return item;
633}
634
635
650int bincmp(unsigned char* b1, unsigned char* b2, int n)
651{
652 int i;
653
654 if (b1==NULL || b2==NULL) return 1;
655
656 for (i=0; i<n; i++) {
657 if (b1[i]!=b2[i]) return 1;
658 }
659
660 return 0;
661}
662
663
674int strnrvscmp(const char* s1, const char* s2, int n)
675{
676 int j1, j2;
677
678 if (s1==NULL || s2==NULL) return 1;
679
680 j1 = (int)strlen(s1) - 1;
681 j2 = (int)strlen(s2) - 1;
682
683 while (n>0 && j1>=0 && j2>=0) {
684 if (s1[j1--] != s2[j2--]) return 1;
685 n--;
686 }
687
688 if (n==0) return 0;
689 else return 1;
690}
691
692
703int strncaservscmp(const char* s1, const char* s2, int n)
704{
705 int j1, j2;
706
707 if (s1==NULL || s2==NULL) return 1;
708
709 j1 = (int)strlen(s1) - 1;
710 j2 = (int)strlen(s2) - 1;
711
712 while (n>0 && j1>=0 && j2>=0) {
713 if (toupper(s1[j1--]) != toupper(s2[j2--])) return 1;
714 n--;
715 }
716
717 if (n==0) return 0;
718 else return 1;
719}
720
721
736char* strstrcase(const char* buf, const char* nd)
737{
738 char* pp;
739 char* pb;
740 char* pn;
741
742 if (buf==NULL || nd==NULL) return NULL;
743
744 pb = (char*)malloc(strlen(buf)+1);
745 if (pb==NULL) return NULL;
746 memcpy(pb, buf, (int)strlen(buf)+1);
747
748 pn = (char*)malloc(strlen(nd)+1);
749 if (pn==NULL) {
750 free(pb);
751 return NULL;
752 }
753 memcpy(pn, nd, (int)strlen(nd)+1);
754
755 upper_string(pb);
756 upper_string(pn);
757
758 pp = strstr(pb, pn);
759 if (pp!=NULL) {
760 pp = (pp - pb) + (char*)buf;
761 }
762 free(pb);
763 free(pn);
764
765 return pp;
766}
767
768
784int ex_strncmp(const char* dat, const char* key, int len)
785{
786 if (dat==NULL || key==NULL) return FALSE;
787
788 if (len==0) {
789 if (!strcmp(dat, key)) return TRUE;
790 }
791 else if (len>0) {
792 if (!strncmp(dat, key, len)) return TRUE;
793 }
794 else if (len<0) {
795 int sz;
796 if (len==-1) sz = (int)strlen(dat);
797 else sz = (int)strlen(key);
798 if (!strncmp(dat, key, sz)) return TRUE;
799 }
800
801 return FALSE;
802}
803
804
820int ex_strncasecmp(const char* dat, const char* key, int len)
821{
822 if (dat==NULL || key==NULL) return FALSE;
823
824 if (len==0) {
825 if (!strcasecmp(dat, key)) return TRUE;
826 }
827 else if (len>0) {
828 if (!strncasecmp(dat, key, len)) return TRUE;
829 }
830 else if (len<0) {
831 int sz;
832 if (len==-1) sz = (int)strlen(dat);
833 else sz = (int)strlen(key);
834 if (!strncasecmp(dat, key, sz)) return TRUE;
835 }
836
837 return FALSE;
838}
839
840
856int ex_strnrvscmp(const char* dat, const char* key, int len)
857{
858 if (dat==NULL || key==NULL) return FALSE;
859
860 if (len==0) {
861 if (!strcmp(dat, key)) return TRUE;
862 }
863 else if (len>0) {
864 if (!strnrvscmp(dat, key, len)) return TRUE;
865 }
866 else if (len<0) {
867 int sz;
868 if (len==-1) sz = (int)strlen(dat);
869 else sz = (int)strlen(key);
870 if (!strnrvscmp(dat, key, sz)) return TRUE;
871 }
872
873 return FALSE;
874}
875
876
892int ex_strncaservscmp(const char* dat, const char* key, int len)
893{
894 if (dat==NULL || key==NULL) return FALSE;
895
896 if (len==0) {
897 if (!strcasecmp(dat, key)) return TRUE;
898 }
899 else if (len>0) {
900 if (!strncaservscmp(dat, key, len)) return TRUE;
901 }
902 else if (len<0) {
903 int sz;
904 if (len==-1) sz = (int)strlen(dat);
905 else sz = (int)strlen(key);
906 if (!strncaservscmp(dat, key, sz)) return TRUE;
907 }
908
909 return FALSE;
910}
911
912
921char* chomp(char* buf)
922{
923 int i, len;
924
925 if (buf==NULL) return NULL;
926
927 len = (int)strlen(buf);
928 for (i=0; i<len; i++) {
929 if (buf[i]==CHAR_LF || buf[i]==CHAR_CR) {
930 buf[i] = '\0';
931 return buf;
932 }
933 }
934 return buf;
935}
936
937
948char* skip_chars(char* pp, const char* check)
949{
950 int n, sqf = 0, dqf = 0;
951
952 n = (int)strlen(check);
953
954 while (*pp!='\0') {
955 while (*pp=='\\') pp += 2;
956 //
957 if (*pp!='\0') {
958 if (!sqf && *pp=='\"') dqf = 1 - dqf;
959 else if (!dqf && *pp=='\'') sqf = 1 - sqf;
960
961 else if (!sqf && !dqf) {
962 int i;
963 for (i=0; i<n; i++) {
964 if (*pp==check[i]) return pp;
965 }
966 }
967 pp++;
968 }
969 }
970
971 return NULL;
972}
973
974
985char* skip_char(char* pp, char cc)
986{
987 int sqf = 0, dqf = 0;
988
989 while (*pp!='\0') {
990 while (*pp=='\\') pp += 2;
991 //
992 if (*pp!='\0') {
993 if (!sqf && *pp=='\"') dqf = 1 - dqf;
994 else if (!dqf && *pp=='\'') sqf = 1 - sqf;
995 else if (!sqf && !dqf && *pp==cc) return pp;
996 pp++;
997 }
998 }
999
1000 return pp;
1001}
1002
1003
1022char* skip_char_pair(char* pp, char pair, char end)
1023{
1024 int cnt = 0, sqf = 0, dqf = 0;
1025
1026 if (*pp==pair) {
1027 cnt = 1;
1028 pp++;
1029 }
1030
1031 while (*pp!='\0') {
1032 while (*pp=='\\') pp += 2;
1033 //
1034 if (*pp!='\0') {
1035 if (!sqf && *pp=='\"') dqf = 1 - dqf;
1036 else if (!dqf && *pp=='\'') sqf = 1 - sqf;
1037
1038 else if (!sqf && !dqf) {
1039 if (*pp==end) cnt--;
1040 else if (*pp==pair) cnt++;
1041 if (cnt==0) return pp;
1042 }
1043 pp++;
1044 }
1045 }
1046
1047 return pp;
1048}
1049
1050
1060char* skip_string_end(char* pp)
1061{
1062 char ch = *pp;
1063
1064 if (*pp=='\"' || *pp=='\'') {
1065 pp++;
1066 //
1067 while (*pp!='\0') {
1068 while (*pp=='\\') pp += 2;
1069 //
1070 if (*pp!='\0') {
1071 if (*pp==ch) return pp;
1072 }
1073 pp++;
1074 }
1075 }
1076 return pp;
1077}
1078
1079
1092char* pack_head_tail_char(char* mesg, char cc)
1093{
1094 int sz;
1095 char* ps;
1096 char* pe;
1097 char* pp;
1098
1099 if (mesg==NULL) return NULL;
1100
1101 ps = mesg;
1102 while(*ps==cc || *ps==CHAR_TAB || *ps==CHAR_LF || *ps==CHAR_CR) ps++;
1103 pe = ps;
1104 while(*pe!='\0') pe++;
1105 pe--;
1106 while(*pe==cc || *pe==CHAR_TAB || *pe==CHAR_LF || *pe==CHAR_CR) pe--;
1107
1108 sz = (int)(pe - ps) + 1;
1109 pp = (char*)malloc((size_t)(sz + 1));
1110 memcpy(pp, ps, sz);
1111 pp[sz] = '\0';
1112
1113 return pp;
1114}
1115
1116
1131/*
1132char* pack_char(char* mesg, char cc)
1133{
1134 return pack_char_len(mesg, cc, -1);
1135}
1136*/
1137
1138
1154char* pack_char_len(char* mesg, char cc, int len)
1155{
1156 int i, j;
1157 int sf = OFF; // 連続 cc 用のフラグ
1158 int ff = ON; // 先頭の cc を無視するためのフラグ
1159 char* pp;
1160
1161 if (mesg==NULL) return NULL;
1162
1163 if (len==0) return NULL;
1164 if (len<0) len = (int)strlen(mesg);
1165 pp = (char*)malloc(len+1);
1166 if (pp==NULL) return NULL;
1167 memset(pp, 0, len+1);
1168
1169 i = j = 0;
1170 while(mesg[i]!='\0' && i<len) {
1171 if (mesg[i]==CHAR_TAB) mesg[i] = ' ';
1172 if (mesg[i]!=CHAR_CR && mesg[i]!=CHAR_LF) { // CR LF を読み飛ばす.
1173 if (mesg[i]==cc) {
1174 if (sf==OFF) {
1175 sf = ON;
1176 if (ff==ON) ff = OFF;
1177 else pp[j++] = mesg[i];
1178 }
1179 }
1180 else {
1181 sf = ff = OFF;
1182 pp[j++] = mesg[i];
1183 }
1184 }
1185 i++;
1186 }
1187 pp[j] = '\0';
1188
1189 // 末尾の cc を削除
1190 i = (int)strlen(pp) - 1;
1191 while(i>=0) {
1192 if (pp[i]==cc) i--;
1193 else break;
1194 }
1195 pp[i+1] = '\0';
1196
1197 return pp;
1198}
1199
1200
1210char* change_esc(char* mesg)
1211{
1212 int i, j;
1213 char* pp;
1214
1215 if (mesg==NULL) return NULL;
1216
1217 pp = (char*)malloc((strlen(mesg)+1)*2);
1218 if (pp==NULL) return NULL;
1219 memset(pp, 0, (strlen(mesg)+1)*2);
1220
1221 i = j = 0;
1222 while(mesg[i]!='\0') {
1223 if (mesg[i]==CHAR_CR) {
1224 pp[j++] = '\\';
1225 pp[j++] = 'r';
1226 }
1227 else if (mesg[i]==CHAR_LF) {
1228 pp[j++] = '\\';
1229 pp[j++] = 'n';
1230 }
1231 else {
1232 pp[j++] = mesg[i];
1233 }
1234 i++;
1235 }
1236 pp[j] = '\0';
1237
1238 return pp;
1239}
1240
1241
1252void replace_char(unsigned char* buf, int len, unsigned char frm, unsigned char toc)
1253{
1254 if (buf==NULL) return;
1255 if (len<=0) len = (int)strlen((char*)buf) + 1;
1256
1257 int i;
1258 for (i=0; i<len; i++) {
1259 if (buf[i]==frm) buf[i] = toc;
1260 }
1261
1262 return;
1263}
1264
1265
1282char* replace_str(char* buf, int len, const char* frm, const char* tos)
1283{
1284 char* wrk = NULL;
1285 int i, j, k, slen, flen, tlen;
1286
1287 if (buf==NULL || frm==NULL || tos==NULL) return NULL;
1288 if (len<=0) len = (int)strlen(buf) + 1;
1289
1290 wrk = (char*)malloc(len);
1291 if (wrk==NULL) return NULL;
1292 memset(wrk, 0, len);
1293
1294 slen = (int)strlen(buf);
1295 flen = (int)strlen(frm);
1296 tlen = (int)strlen(tos);
1297
1298 i = j = 0;
1299 while (i<slen && j<len) {
1300 if (!strncmp((const char*)(buf+i), frm, flen)){
1301 for (k=0; k<tlen; k++) {
1302 wrk[j+k] = tos[k];
1303 }
1304 i += flen;
1305 j += tlen;
1306 }
1307 else {
1308 wrk[j++] = buf[i++];
1309 }
1310 }
1311
1312 //
1313 if (j>=len) {
1314 free(wrk);
1315 return NULL;
1316 }
1317
1318 wrk[j] = '\0';
1319 for (k=0; k<=j; k++) buf[k] = wrk[k];
1320 free(wrk);
1321
1322 return buf;
1323}
1324
1325
1338char* cut_str(char* buf, int ls, int le)
1339{
1340 int i, len;
1341 char* ret;
1342
1343 if (buf==NULL) return NULL;
1344
1345 ls = Max(ls, 0);
1346 le = Min(le, (int)strlen((const char*)buf));
1347 len = le - ls + 1;
1348 if (len<=0) return NULL;
1349
1350 ret = (char*)malloc(len+1);
1351 if (ret==NULL) return NULL;
1352 memset(ret, 0, len+1);
1353
1354 for (i=0; i<len; i++) ret[i] = buf[i+ls];
1355
1356 return ret;
1357}
1358
1359
1368char* dup_str(char* buf)
1369{
1370 int len;
1371 char* ret;
1372
1373 if (buf==NULL) return NULL;
1374
1375 len = (int)strlen(buf);
1376 ret = (char*)malloc(len+1);
1377 if (ret==NULL) return NULL;
1378
1379 memcpy(ret, buf, len);
1380 ret[len] = '\0';
1381
1382 return ret;
1383}
1384
1385
1394int is_number(unsigned char* str)
1395{
1396 if (str==NULL) return 0;
1397 int i, len = (int)strlen((char*)str);
1398
1399 int cnt = 0;
1400 for (i=0; i<len; i++) {
1401 if (str[i]=='.') cnt += 1;
1402 else if (str[i]<'0' || str[i]>'9') return 0;
1403 }
1404 if (cnt>1) return 0;
1405 else if (cnt>0) return 2;
1406 return 1;
1407}
1408
1409
1410static char _ToSTR[LDATA];
1411
1420char* itostr(int n)
1421{
1422 memset(_ToSTR, 0, LDATA);
1423 snprintf(_ToSTR, LDATA-1, "%d", n);
1424 return _ToSTR;
1425}
1426
1427
1436char* ltostr(long int n)
1437{
1438 memset(_ToSTR, 0, LDATA);
1439 snprintf(_ToSTR, LDATA-1, "%ld", n);
1440 return _ToSTR;
1441}
1442
1443
1452char* ultostr(unsigned long int n)
1453{
1454 memset(_ToSTR, 0, LDATA);
1455 snprintf(_ToSTR, LDATA-1, "%lu", n);
1456 return _ToSTR;
1457}
1458
1459
1468char* lltostr(long long int n)
1469{
1470 memset(_ToSTR, 0, LDATA);
1471 snprintf(_ToSTR, LDATA-1, "%lld", n);
1472 return _ToSTR;
1473}
1474
1475
1484char* ulltostr(unsigned long long int n)
1485{
1486 memset(_ToSTR, 0, LDATA);
1487 snprintf(_ToSTR, LDATA-1, "%llu", n);
1488 return _ToSTR;
1489}
1490
1491
1500char* ftostr(float n)
1501{
1502 memset(_ToSTR, 0, LDATA);
1503 snprintf(_ToSTR, LDATA-1, "%f", n);
1504 return _ToSTR;
1505}
1506
1507
1516char* dtostr(double n)
1517{
1518 memset(_ToSTR, 0, LDATA);
1519 snprintf(_ToSTR, LDATA-1, "%f", n);
1520 return _ToSTR;
1521}
1522
1523
1532char* itostr_ts(int n)
1533{
1534 char* str = NULL;
1535 str = (char*)malloc(LDATA);
1536 if (str==NULL) return NULL;
1537
1538 memset(str, 0, LDATA);
1539 snprintf(str, LDATA-1, "%d", n);
1540 return str;
1541}
1542
1543
1552char* ltostr_ts(long int n)
1553{
1554 char* str = NULL;
1555 str = (char*)malloc(LDATA);
1556 if (str==NULL) return NULL;
1557
1558 memset(str, 0, LDATA);
1559 snprintf(str, LDATA-1, "%ld", n);
1560 return str;
1561}
1562
1563
1572char* ultostr_ts(unsigned long int n)
1573{
1574 char* str = NULL;
1575 str = (char*)malloc(LDATA);
1576 if (str==NULL) return NULL;
1577
1578 memset(str, 0, LDATA);
1579 snprintf(str, LDATA-1, "%lu", n);
1580 return str;
1581}
1582
1583
1592char* lltostr_ts(long long int n)
1593{
1594 char* str = NULL;
1595 str = (char*)malloc(LDATA);
1596 if (str==NULL) return NULL;
1597
1598 memset(str, 0, LDATA);
1599 snprintf(str, LDATA-1, "%lld", n);
1600 return str;
1601}
1602
1603
1612char* ulltostr_ts(unsigned long long int n)
1613{
1614 char* str = NULL;
1615 str = (char*)malloc(LDATA);
1616 if (str==NULL) return NULL;
1617
1618 memset(str, 0, LDATA);
1619 snprintf(str, LDATA-1, "%llu", n);
1620 return str;
1621}
1622
1623
1632char* ftostr_ts(float n)
1633{
1634 char* str = NULL;
1635 str = (char*)malloc(LDATA);
1636 if (str==NULL) return NULL;
1637
1638 memset(str, 0, LDATA);
1639 snprintf(str, LDATA-1, "%f", n);
1640 return str;
1641}
1642
1643
1652char* dtostr_ts(double n)
1653{
1654 char* str = NULL;
1655 str = (char*)malloc(LDATA);
1656 if (str==NULL) return NULL;
1657
1658 memset(str, 0, LDATA);
1659 snprintf(str, LDATA-1, "%f", n);
1660 return str;
1661}
1662
1663
1673int count_lines(const char* buf)
1674{
1675 int i = 0;
1676 int line = 0;
1677
1678 if (buf==NULL) return 0;
1679 line++;
1680
1681 while(buf[i]!='\0') {
1682 if (buf[i]==CHAR_CR) {
1683 line++;
1684 if (buf[i+1]==CHAR_LF) i++;
1685 }
1686 else if (buf[i]==CHAR_LF) {
1687 line++;
1688 }
1689 i++;
1690 }
1691
1692 return line;
1693}
1694
1695
1706int hexstr2i(const char* str)
1707{
1708 int i, ret = 0;
1709 if (str==NULL) return ret;
1710
1711 int len = (int)strlen(str);
1712
1713 for (i=0; i<len; i++) {
1714 if (str[i]>='0' && str[i]<='9') {
1715 ret = ret*16;
1716 ret += (int)(str[i] - '0');
1717 }
1718 else if (str[i]>='A' && str[i]<='F') {
1719 ret = ret*16;
1720 ret += (int)(str[i] - 'A') + 10;
1721 }
1722 else if (str[i]>='a' && str[i]<='f') {
1723 ret = ret*16;
1724 ret += (int)(str[i] - 'a') + 10;
1725 }
1726 else if (str[i]!=' ') {
1727 break;
1728 }
1729 }
1730
1731 return ret;
1732}
1733
1735
1736#ifndef WIN32
1737
1747void init_rand(void)
1748{
1749 FILE* fp;
1750 unsigned int seed;
1751 size_t sz;
1752 UNUSED(sz);
1753
1754 fp = fopen("/dev/urandom", "rb");
1755 if (fp==NULL) {
1756 srand(time(NULL));
1757 return;
1758 }
1759 sz = fread(&seed, sizeof(unsigned int), 1, fp);
1760 fclose(fp);
1761
1762 srand(seed);
1763}
1764
1765#endif
1766
1767
1777char* randstr(int n)
1778{
1779 char base[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
1780 char* pass;
1781 int i, sz;
1782
1783 if (n<=0) return NULL;
1784 pass = (char*)malloc(n+1);
1785 if (pass==NULL) return pass;
1786
1787 sz = (int)strlen(base);
1788 for (i=0; i<n; i++) pass[i] = base[rand()%sz];
1789 pass[n] = '\0';
1790
1791 return pass;
1792}
1793
1794
1804unsigned char* randbit(int n)
1805{
1806 int i, sz;
1807 unsigned char* bin;
1808
1809 sz = (n+7)/8;
1810 bin = (unsigned char*)malloc(sz);
1811 if (bin==NULL) return NULL;
1812
1813 memset(bin, 0, sz);
1814 for (i=0; i<n; i++) setBit(bin, i, rand()%2);
1815
1816 return bin;
1817}
1818
1819
1821
1822//
1823// 64bit 変換
1824unsigned long long int ntohull(unsigned long long int s)
1825{
1826 if (is_little_endian()) {
1827 long long int d;
1828 uByte* src = (uByte*)&s;
1829 uByte* dst = (uByte*)&d;
1830 dst[0] = src[7];
1831 dst[1] = src[6];
1832 dst[2] = src[5];
1833 dst[3] = src[4];
1834 dst[4] = src[3];
1835 dst[5] = src[2];
1836 dst[6] = src[1];
1837 dst[7] = src[0];
1838 return d;
1839 }
1840 return s;
1841}
1842
1843
1854void swap_byte(void* p, int s, int c)
1855{
1856 int i;
1857 uByte* u = (uByte*)p;
1858 for (i=0; i<s; i+=c) reverse_str(&u[i], c);
1859}
1860
1861
1862
1872short swaps(unsigned short p)
1873{
1874 short r;
1875 uByte* t;
1876 uByte* f;
1877
1878 t = (uByte*)&r;
1879 f = (uByte*)&p;
1880 t[0] = f[1];
1881 t[1] = f[0];
1882
1883 return r;
1884}
1885
1886
1896int swapl(unsigned int p)
1897{
1898 int r;
1899 uByte* t;
1900 uByte* f;
1901
1902 t = (uByte*)&r;
1903 f = (uByte*)&p;
1904 t[0] = f[3];
1905 t[1] = f[2];
1906 t[2] = f[1];
1907 t[3] = f[0];
1908
1909 return r;
1910}
1911
1912
1923long long int swapd(unsigned long long int p)
1924{
1925 long long int r;
1926 uByte* t;
1927 uByte* f;
1928
1929 t = (uByte*)&r;
1930 f = (uByte*)&p;
1931 t[0] = f[7];
1932 t[1] = f[6];
1933 t[2] = f[5];
1934 t[3] = f[4];
1935 t[4] = f[3];
1936 t[5] = f[2];
1937 t[6] = f[1];
1938 t[7] = f[0];
1939
1940 return r;
1941}
1942
1943
1952void reverse_str(uByte* p, int s)
1953{
1954 int i;
1955 uByte c;
1956
1957 if (s<=0) s = (int)strlen((const char*)p);
1958
1959 for (i=0; i<s/2; i++) {
1960 c = p[s-1-i];
1961 p[s-1-i] = p[i];
1962 p[i] = c;
1963 }
1964}
1965
1966
1967
1969
1985int file_from_to(const char* src, const char* dst, const char* mode)
1986{
1987 long int sz;
1988 unsigned char* buf;
1989 FILE* fp;
1990 size_t rs;
1991 UNUSED(rs);
1992
1993 sz = file_size(src);
1994 if (sz<0) return JBXL_FILE_EXIST_ERROR;
1995 buf = (unsigned char*)malloc(sz);
1996 if (buf==NULL) return JBXL_MALLOC_ERROR;
1997 memset(buf, 0, sz);
1998
1999 fp = fopen(src, "rb");
2000 if (fp==NULL) {
2001 free(buf);
2002 return JBXL_FILE_OPEN_ERROR;
2003 }
2004 rs = fread(buf, sz, 1, fp);
2005 fclose(fp);
2006
2007 fp = fopen(dst, mode);
2008 if (fp==NULL) {
2009 free(buf);
2011 }
2012 fwrite(buf, sz, 1, fp);
2013 fclose(fp);
2014
2015 free(buf);
2016 return sz;
2017}
2018
2019
2035int fp_from_to(FILE* src, FILE* dst, long int sz)
2036{
2037 unsigned char* buf;
2038 size_t rs;
2039 UNUSED(rs);
2040
2041 if (sz<=0) return JBXL_ARGS_ERROR;
2042 if (src==NULL) return JBXL_FILE_OPEN_ERROR;
2043 if (dst==NULL) return JBXL_FILE_DESTOPEN_ERROR;
2044
2045 buf = (unsigned char*)malloc(sz);
2046 if (buf==NULL) return JBXL_MALLOC_ERROR;
2047 memset(buf, 0, sz);
2048
2049 rs = fread(buf, sz, 1, src);
2050 sz = (int)fwrite(buf, sz, 1, dst);
2051
2052 free(buf);
2053 return sz;
2054}
2055
2056
2066char* get_file_name(const char* str)
2067{
2068 if (str==NULL) return NULL;
2069
2070#ifdef WIN32
2071 char cc = '\\';
2072#else
2073 char cc = '/';
2074#endif
2075
2076 int len = (int)strlen(str);
2077 int sz = 0;
2078 while (sz<len && str[len-1-sz]!=cc) sz++;
2079 char* fnm = (char*)str + len - sz;
2080
2081 return fnm;
2082}
2083
2084
2094char* del_file_name(const char* str)
2095{
2096 if (str==NULL) return NULL;
2097
2098#ifdef WIN32
2099 char cc = '\\';
2100#else
2101 char cc = '/';
2102#endif
2103
2104 char* path = (char*)str;
2105 int len = (int)strlen(str);
2106 if (len==1) {
2107 if (path[0]==cc) return path;
2108 else return NULL;
2109 }
2110
2111 int sz = len - 1;
2112 while (sz>=0 && str[sz]!=cc) sz--;
2113
2114 if (sz<0) {
2115 path[0] = '.';
2116 path[1] = cc;
2117 path[2] = '\0';
2118 }
2119 else {
2120 path[sz+1] = '\0';
2121 }
2122
2123 return path;
2124}
2125
2126
2137/*
2138char* make_file_path(const char* str)
2139{
2140 if (str==NULL || str[0]=='\0') return NULL;
2141
2142 int len = (int)strlen(str);
2143 char* path = (char*)malloc(len+1);
2144 memcpy(path, str, len+1);
2145
2146#ifdef WIN32
2147 char cc = '\\';
2148#else
2149 char cc = '/';
2150#endif
2151
2152 if (len==1) {
2153 if (path[0]==cc) return path;
2154 else {
2155 free(path);
2156 return NULL;
2157 }
2158 }
2159
2160 int sz = len - 1;
2161 while (sz>=0 && path[sz]!=cc) sz--;
2162
2163 if (sz<0) {
2164 if (len>=2) {
2165 path[0] = '.';
2166 path[1] = cc;
2167 path[2] = '\0';
2168 }
2169 else {
2170 free(path);
2171 path = NULL;
2172 }
2173 }
2174 else {
2175 path[sz+1] = '\0';
2176 }
2177
2178 return path;
2179}
2180*/
2181
2182
2191char* get_file_path(const char* str)
2192{
2193 if (str==NULL || str[0]=='\0') return NULL;
2194
2195 int len = (int)strlen(str);
2196 char* path = (char*)malloc(len + 1);
2197 memcpy(path, str, len + 1);
2198
2199 char cc1 = '\\';
2200 char cc2 = '/';
2201
2202 int sz = len - 1;
2203 while (sz>=0 && path[sz]!=cc1 && path[sz]!=cc2) sz--;
2204
2205 if (sz<0) {
2206 free(path);
2207 path = NULL;
2208 }
2209 else {
2210 path[sz+1] = '\0';
2211 }
2212
2213 return path;
2214}
2215
2216
2225char* get_file_extension(const char* str)
2226{
2227 int sz, len;
2228 char* ext;
2229
2230 if (str==NULL) return NULL;
2231
2232 char pd = '.';
2233 char cc1 = '\\';
2234 char cc2 = '/';
2235
2236 len = (int)strlen(str);
2237 sz = 0;
2238 while (sz<len && str[len-1-sz]!=cc1 && str[len-1-sz]!=cc2 && str[len-1-sz]!=pd) sz++;
2239
2240 if (str[len-1-sz]!=pd) return NULL;
2241 ext = (char*)str + len - sz;
2242
2243 return ext;
2244}
2245
2246
2256char* del_file_extension(const char* str)
2257{
2258 if (str==NULL) return NULL;
2259
2260 char cc = '.';
2261 char* path = (char*)str;
2262
2263 int len = (int)strlen(path);
2264 int sz = len - 1;
2265 while (sz>=0 && path[sz]!=cc) sz--;
2266
2267 if (sz<1) return path;
2268 path[sz] = '\0';
2269
2270 return path;
2271}
2272
2273
2282char* cut_file_extension(const char* str)
2283{
2284 if (str==NULL) return NULL;
2285
2286 char cc = '.';
2287 int len = (int)strlen(str);
2288 char* path = (char*)malloc(len+1);
2289 memcpy(path, str, len+1);
2290
2291 int sz = len - 1;
2292 while (sz>=0 && path[sz]!=cc) sz--;
2293
2294 if (sz<1) return path;
2295 path[sz] = '\0';
2296
2297 return path;
2298}
2299
2300
2309unsigned long int file_size(const char* fn)
2310{
2311 if (fn==NULL) return -1;
2312
2313 struct stat stbuf;
2314 stat(fn, &stbuf);
2315
2316#ifdef WIN32
2317 return stbuf.st_size;
2318#else
2319 if (S_ISREG(stbuf.st_mode)) return stbuf.st_size;
2320 else return -2;
2321#endif
2322}
2323
2324
2337int file_exist(const char* fn)
2338{
2339 FILE* fp;
2340
2341 if (fn==NULL) return FALSE;
2342
2343 if ((fp=fopen(fn,"rb"))==NULL) {
2344 return FALSE;
2345 }
2346 fclose(fp);
2347 return TRUE;
2348}
2349
2350
2366FILE* file_chmod_open(const char* fn, const char* fm, mode_t mode)
2367{
2368 FILE* fp;
2369
2370 if (!file_exist(fn)) {
2371 if ((fp=fopen(fn,"wb"))==NULL) return NULL;
2372 fclose(fp);
2373 }
2374
2375#ifndef WIN32
2376 fp = NULL;
2377 if (chmod(fn, mode)) return fp;
2378#endif
2379
2380 fp = fopen(fn, fm);
2381 return fp;
2382}
2383
2384
2397char* temp_filename(const char* dir, int flen)
2398{
2399 FILE* fp;
2400 int i, dlen=0;
2401 char nostr = '\0';
2402 char* fname;
2403 char* fnbin;
2404 char* fnb64;
2405 size_t rs;
2406 UNUSED(rs);
2407
2408 if (dir==NULL) dir = &nostr;
2409 dlen = (int)strlen(dir);
2410 if (flen<=0) flen = 15;
2411
2412 fname = (char*)malloc(dlen+flen+1);
2413 if (fname==NULL) return NULL;
2414 memset(fname, 0, dlen+flen+1);
2415
2416 fnbin = (char*)malloc(flen);
2417 if (fnbin==NULL) {
2418 free(fname);
2419 return NULL;
2420 }
2421 memset(fnbin, 0, flen);
2422
2423 fnb64 = NULL;
2424 fp = fopen("/dev/urandom", "rb");
2425
2426 do {
2427 if (fp!=NULL) {
2428 rs = fread(fnbin, flen, 1, fp);
2429 fnb64 = (char*)encode_base64((unsigned char*)fnbin, flen);
2430 if (fnb64!=NULL) fnb64[flen] = '\0';
2431 }
2432 if (fnb64==NULL) fnb64 = randstr(flen);
2433
2434 for (i=0; i<flen; i++) {
2435 if (fnb64[i]=='/') fnb64[i] = 'x';
2436 if (fnb64[i]=='+') fnb64[i] = 'X';
2437 }
2438
2439 memset (fname, 0, dlen+flen+1);
2440 strncpy(fname, dir, dlen);
2441 strncat(fname, fnb64, flen);
2442 free(fnb64);
2443 } while(file_exist(fname));
2444
2445 if (fp!=NULL) fclose(fp);
2446 free(fnbin);
2447 return fname;
2448}
2449
2450
2460unsigned char* read_file(const char* fname, long unsigned int* size)
2461{
2462 size_t rs;
2463 UNUSED(rs);
2464
2465 if (size==NULL) return NULL;
2466
2467 *size = file_size(fname);
2468 if (*size<=0) return NULL;
2469
2470 unsigned char* buf = (unsigned char*)malloc(*size);
2471 if (buf==NULL) return NULL;
2472 memset(buf, 0, *size);
2473
2474 FILE* fp = fopen(fname, "rb");
2475 if (fp==NULL) {
2476 free(buf);
2477 return NULL;
2478 }
2479
2480 rs = fread(buf, *size, 1, fp);
2481 fclose(fp);
2482
2483 return buf;
2484}
2485
2486
2497long unsigned int write_file(const char* fname, unsigned char* buf, long unsigned int size)
2498{
2499 if (size==0) return 0;
2500
2501 FILE* fp = fopen(fname, "wb");
2502 if (fp==NULL) return 0;
2503
2504 size = (long unsigned int)fwrite(buf, size, 1, fp);
2505 fclose(fp);
2506
2507 return size;
2508}
2509
2510
2511int mkdirp(const char* path, mode_t mode)
2512{
2513 if (path==NULL) return JBXL_ARGS_ERROR;
2514
2515 long unsigned int lpath = (long unsigned int)strlen(path);
2516 char* file_name = (char*)malloc(lpath + 1);
2517 memcpy(file_name, path, lpath);
2518 file_name[lpath] = '\0';
2519 //
2520 long unsigned int size = 0;
2521 int mark = 1;
2522#ifdef WIN32
2523 if (file_name[1]==':') mark = 2; // ex.) "D:/abc/xyz"
2524#endif
2525
2526 char* wrk = (char*)malloc(lpath + 1);
2527 while (size < lpath) {
2528 memcpy(wrk, file_name, lpath + 1);
2529 int dirs = 0;
2530 for (long unsigned int ptr=0; ptr<=lpath; ptr++) {
2531 if (wrk[ptr]=='/') dirs++;
2532 if (mark==dirs) {
2533 wrk[ptr] = '\0';
2534 struct stat stbuf;
2535 int ret = stat(wrk, &stbuf);
2536 if (ret>=0) {
2537 if (!(stbuf.st_mode & S_IFDIR)) {
2538 return JBXL_FILE_EXIST_ERROR;
2539 }
2540 break;
2541 }
2542 ret = mkdir(wrk, mode);
2543 if (ret<0) return JBXL_DIR_MAKE_ERROR;
2544 break;
2545 }
2546 size = ptr;
2547 }
2548 mark++;
2549 }
2550 free(wrk);
2551 return JBXL_NORMAL;
2552}
2553
2554
2564char* double_bs(char* str)
2565{
2566 int i, j;
2567 int len, bsn=0;
2568 char* buf;
2569
2570 len = (int)strlen(str);
2571 for (i=0; i<len; i++) if (str[i]=='\\') bsn++;
2572 buf = (char*)malloc(len+bsn+1);
2573 if (buf==NULL) return NULL;
2574 memset(buf, 0, len+bsn+1);
2575
2576 for (i=0,j=0; i<len; i++) {
2577 buf[j++] = str[i];
2578 if (str[i]=='\\') buf[j++] = '\\';
2579 }
2580 buf[j] = '\0';
2581
2582 return buf;
2583}
2584
2585
2598char* numbering_name(const char* fmt, int n)
2599{
2600 int len;
2601 char fname[LNAME], *fo;
2602
2603 memset(fname, 0, LNAME);
2604 snprintf(fname, LNAME-1, fmt, n);
2605 len = (int)strlen(fname);
2606
2607 fo = (char*)malloc(len+1);
2608 if (fo==NULL) return NULL;
2609
2610 memset(fo, 0, len+1);
2611 strncpy(fo, fname, len);
2612 return fo;
2613}
2614
2615
2616
2618
2629void kanji_convert(unsigned char* mesg)
2630{
2631 if (KanjiCode==CODE_SJIS) {
2633 }
2634}
2635
2636
2644void kanji_convert_euc2sjis(unsigned char* mesg)
2645{
2646 int i = 0;
2647 while(mesg[i]!='\0' && mesg[i+1]!='\0'){
2648 if (mesg[i]>=0xa1 && mesg[i]<=0xfe){ // EUC
2649 euc2sjis(&mesg[i], &mesg[i+1]);
2650 i = i + 2;
2651 }
2652 else i++;
2653 }
2654}
2655
2656
2664void kanji_convert_sjis2euc(unsigned char* mesg)
2665{
2666 int i = 0;
2667 while(mesg[i]!='\0' && mesg[i+1]!='\0'){
2668 // if文が変則的なのは,コンパイラで警告が出るため (GCC) 3.3.2 20031218
2669 if ((mesg[i]>=0x81 && mesg[i]<=0x9f) ||
2670 (mesg[i]>=0xe0 && mesg[i]<=0xfe) || mesg[i]==0xff) { // SJIS
2671 sjis2euc(&mesg[i], &mesg[i+1]);
2672 i = i + 2;
2673 }
2674 else i++;
2675 }
2676}
2677
2678
2687void euc2sjis(unsigned char *c1, unsigned char *c2)
2688{
2689 if (*c1%2==0) *c2 -= 0x02;
2690 else{
2691 *c2 -= 0x61;
2692 if (*c2>0x7e) (*c2)++;
2693 }
2694
2695 if (*c1<0xdf) {
2696 (*c1)++;
2697 *c1 /= 2;
2698 *c1 += 0x30;
2699 }
2700 else {
2701 (*c1)++;
2702 *c1 /= 2;
2703 *c1 += 0x70;
2704 }
2705}
2706
2707
2716void sjis2euc(unsigned char *c1, unsigned char *c2)
2717{
2718 if (*c2<0x9f) {
2719 if (*c1 < 0xa0) {
2720 *c1 -= 0x81;
2721 *c1 *= 2;
2722 *c1 += 0xa1;
2723 }
2724
2725 else {
2726 *c1 -= 0xe0;
2727 *c1 *= 2;
2728 *c1 += 0xdf;
2729 }
2730 if (*c2>0x7f) (*c2)--;
2731 *c2 += 0x61;
2732 }
2733 else {
2734 if (*c1<0xa0) {
2735 *c1 -= 0x81;
2736 *c1 *= 2;
2737 *c1 += 0xa2;
2738 }
2739 else {
2740 *c1 -= 0xe0;
2741 *c1 *= 2;
2742 *c1 += 0xe0;
2743 }
2744 *c2 += 2;
2745 }
2746}
2747
2748
2756void upper_string(char* str)
2757{
2758 int i;
2759 for (i=0; i<(int)strlen((const char*)str); i++) {
2760 if (str[i]>='a' && str[i]<='z') str[i] += 'A' - 'a';
2761 }
2762}
2763
2764
2786unsigned char* decode_base64(unsigned char* buf, int* sz)
2787{
2788 int i, j, cc=0, bas, lt, ln;
2789 unsigned char* dcd;
2790
2791 lt = 0;
2792 ln = (int)strlen((const char*)buf);
2793 while (buf[lt]!='=' && lt<ln) {
2794 lt++;
2795 if (lt==ln) break;
2796 }
2797
2798 int len = lt/4*3 + (lt%4)*3/4;
2799 if (sz!=NULL) *sz = len;
2800
2801 dcd = (unsigned char*)malloc(len+1);
2802 if (dcd==NULL) return NULL;
2803 memset(dcd, 0, len+1);
2804
2805 for (i=0; i<lt; i++) {
2806 if (buf[i]>='A' && buf[i]<='Z') cc = buf[i] - 'A';
2807 else if (buf[i]>='a' && buf[i]<='z') cc = buf[i] - 'a' + 26;
2808 else if (buf[i]>='0' && buf[i]<='9') cc = buf[i] - '0' + 52;
2809 else if (buf[i]=='+') cc = 62;
2810 else if (buf[i]=='/') cc = 63;
2811
2812 if (cc<64) {
2813 bas = 32;
2814 for (j=0; j<6; j++) {
2815 setBit(dcd, i*6+j, cc/bas);
2816 cc = cc%bas;
2817 bas = bas/2;
2818 }
2819 }
2820 }
2821 return dcd;
2822}
2823
2824
2848unsigned char* encode_base64(unsigned char* buf, int sz)
2849{
2850 unsigned char base[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
2851 unsigned char bas;
2852 int i, j, len;
2853 unsigned char* ecd;
2854
2855 if (buf==NULL) return NULL;
2856 if (sz<0) len = (int)strlen((const char*)buf);
2857 else len = sz;
2858 if (len<=0) return NULL;
2859
2860 sz = ((len+2)/3)*4;
2861 ecd = (unsigned char*)malloc(sz+1);
2862 if (ecd==NULL) return NULL;
2863 memset(ecd, 0, sz+1);
2864
2865 for (i=0; i<sz; i++) {
2866 bas = 0x00;
2867 if (len*8 > i*6) {
2868 for (j=0; j<6; j++) {
2869 if (len*8 > i*6+j) setBit(&bas, j+2, getBit(buf, i*6+j));
2870 //else setBit(&bas, j+2, 0);
2871 }
2872 ecd[i] = base[(int)bas];
2873 }
2874 else {
2875 ecd[i] = '=';
2876 }
2877 }
2878 return ecd;
2879}
2880
2881
2887unsigned char* decode_base64_filename(unsigned char* buf, int* sz, unsigned char cc)
2888{
2889 if (cc==0x00) cc = '-';
2890
2891 int i, len = (int)strlen((char*)buf);
2892 for (i=0; i<len; i++) {
2893 if (buf[i]==cc) buf[i] = '/';
2894 }
2895
2896 unsigned char* dec = decode_base64(buf, sz);
2897
2898 return dec;
2899}
2900
2901
2907unsigned char* encode_base64_filename(unsigned char* buf, int sz, unsigned char cc)
2908{
2909 if (cc==0x00) cc = '-';
2910
2911 unsigned char* enc = encode_base64(buf, sz);
2912
2913 int i, len = (int)strlen((char*)enc);
2914 for (i=0; i<len; i++) {
2915 if (enc[i]=='/') enc[i] = cc;
2916 }
2917
2918 return enc;
2919}
2920
2921
2932unsigned char* decode_urlenc(unsigned char* buf, int* sz)
2933{
2934 int i, j, len;
2935 unsigned char* dec;
2936
2937 if (buf==NULL) return NULL;
2938
2939 len = (int)strlen((const char*)buf) + 1;
2940 dec = (unsigned char*)malloc(len);
2941 if (dec==NULL) return NULL;
2942 memset(dec, 0, len);
2943
2944 i = j = 0;
2945 while (buf[i]!='\0') {
2946 if (buf[i]=='%') {
2947 if (buf[i+1]=='\0') return dec;
2948 if (buf[i+2]=='\0') return dec;
2949 dec[j++] = decode_hex(buf[i+1], buf[i+2]);
2950 i += 2;
2951 }
2952 else {
2953 if (buf[i]=='+') dec[j++] = ' ';
2954 else dec[j++] = buf[i];
2955 }
2956 i++;
2957 }
2958
2959 *sz = j;
2960 return dec;
2961}
2962
2963
2964
2979unsigned char* encode_urlenc(unsigned char* buf, int sz)
2980{
2981 int i, j, len;
2982 unsigned char* enc;
2983
2984 if (buf==NULL) return NULL;
2985
2986 if (sz<0) sz = (int)strlen((const char*)buf);
2987 len = sz*3 + 1;
2988 enc = (unsigned char*)malloc(len);
2989 if (enc==NULL) return NULL;
2990 memset(enc, 0, len);
2991
2992 for(i=0, j=0; i<sz; i++) {
2993 if (buf[i]==' ') { // 半角スペース
2994 enc[j++] = '+';
2995 }
2996 else if ((buf[i]>=0x30 && buf[i]<=0x39) || // 0-9
2997 (buf[i]>=0x41 && buf[i]<=0x5a) || // A-Z
2998 (buf[i]>=0x61 && buf[i]<=0x7a) || // a-z
2999 buf[i]=='-' || buf[i]=='.' || buf[i]=='_'){ // - . _
3000 enc[j++] = buf[i];
3001 }
3002 else {
3003 unsigned char* asc = encode_hex(buf[i]);
3004 if (asc==NULL) {
3005 free(enc);
3006 return NULL;
3007 }
3008 enc[j++] = '%';
3009 enc[j++] = asc[0];
3010 enc[j++] = asc[1];
3011 free(asc);
3012 }
3013 }
3014
3015 return enc;
3016}
3017
3018
3029unsigned char* decode_quoted_printable(unsigned char* buf, int* sz)
3030{
3031 int i, j, len;
3032 unsigned char* dec;
3033
3034 len = (int)strlen((const char*)buf) + 1;
3035 dec = (unsigned char*)malloc(len);
3036 if (dec==NULL) return NULL;
3037 memset(dec, 0, len);
3038
3039 i = j = 0;
3040 while (buf[i]!='\0') {
3041 if (buf[i]=='=') {
3042 if (buf[i+1]=='\0') return dec;
3043 if (buf[i+2]=='\0') return dec;
3044 dec[j++] = decode_hex(buf[i+1], buf[i+2]);
3045 i += 2;
3046 }
3047 else {
3048 if (buf[i]=='_') dec[j++] = ' '; // RFC2047
3049 else dec[j++] = buf[i];
3050 }
3051 i++;
3052 }
3053
3054 *sz = j;
3055 return dec;
3056}
3057
3058
3074unsigned char* encode_quoted_printable(unsigned char* buf, int sz)
3075{
3076 int i, j, len;
3077 unsigned char* enc;
3078
3079 if (sz<0) sz = (int)strlen((const char*)buf);
3080 len = sz*3 + 1;
3081 enc = (unsigned char*)malloc(len);
3082 if (enc==NULL) return NULL;
3083 memset(enc, 0, len);
3084
3085 for (i=0, j=0; i<sz; i++) {
3086 if (buf[i]=='=') { // 0x3d
3087 enc[j++] = '=';
3088 enc[j++] = '3';
3089 enc[j++] = 'D';
3090 }
3091 else if (buf[i]=='_') { // 0x5f
3092 enc[j++] = '=';
3093 enc[j++] = '5';
3094 enc[j++] = 'F';
3095 }
3096 else if (buf[i]==' ') { // 0x20 RFC2047
3097 enc[j++] = '_';
3098 }
3099 else if (buf[i]<=0x1f || buf[i]>=0x7f) {
3100 unsigned char* asc = encode_hex(buf[i]);
3101 if (asc==NULL) {
3102 free(enc);
3103 return NULL;
3104 }
3105 enc[j++] = '=';
3106 enc[j++] = asc[0];
3107 enc[j++] = asc[1];
3108 free(asc);
3109 }
3110 else {
3111 enc[j++] = buf[i];
3112 }
3113 }
3114
3115 return enc;
3116}
3117
3118
3138unsigned char* encode_hex(unsigned char cc)
3139{
3140 unsigned char* ret;
3141 unsigned char pp1, pp2;
3142 unsigned char base[] = "0123456789ABCDEF";
3143
3144 ret = (unsigned char*)malloc(3);
3145 if (ret==NULL) return NULL;
3146
3147 pp1 = cc >> 4;
3148 pp2 = cc & 0x0f;
3149
3150 ret[0] = base[pp1];
3151 ret[1] = base[pp2];
3152 ret[2] = '\0';
3153
3154 return ret;
3155}
3156
3157
3171unsigned char decode_hex(unsigned char pp1, unsigned char pp2)
3172{
3173 unsigned char ret;
3174
3175 if (pp1>=0x30 && pp1<=0x39) pp1 -= 0x30; // 0-9
3176 else if (pp1>=0x41 && pp1<=0x46) pp1 -= 0x37; // A-F
3177 else if (pp1>=0x61 && pp1<=0x66) pp1 -= 0x57; // a-f
3178 else pp1 = 0x00;
3179
3180 if (pp2>=0x30 && pp2<=0x39) pp2 -= 0x30; // 0-9
3181 else if (pp2>=0x41 && pp2<=0x46) pp2 -= 0x37; // A-F
3182 else if (pp2>=0x41 && pp2<=0x46) pp2 -= 0x57; // a-f
3183 else pp1 = 0x00;
3184
3185 ret = (pp1<<4) + pp2;
3186 return ret;
3187}
3188
3189
3190
3192// バイト型 リングバッファ
3193//
3194
3205{
3206 ringBuffer* rb;
3207
3208 rb = (ringBuffer*)malloc(sizeof(ringBuffer));
3209 if (rb==NULL) return NULL;
3210 memset(rb, 0, sizeof(ringBuffer));
3211 rb->state = JBXL_NORMAL;
3212
3213 if (sz>0) {
3214 rb->buf = (unsigned char*)malloc(sz);
3215 if (rb->buf==NULL) return rb;
3216 memset(rb->buf, 0, sz);
3217 rb->bufsz = sz;
3218 }
3219 return rb;
3220}
3221
3222
3233{
3234 if (rb!=NULL && *rb!=NULL) {
3235 freeNull((*rb)->buf);
3236 free(*rb);
3237 *rb = NULL;
3238 }
3239}
3240
3241
3251{
3252 ringBuffer rb;
3253
3254 memset(&rb, 0, sizeof(ringBuffer));
3255 rb.state = JBXL_NORMAL;
3256
3257 return rb;
3258}
3259
3260
3271{
3272 ringBuffer rb;
3273
3274 memset(&rb, 0, sizeof(ringBuffer));
3275
3276 if (sz>0) {
3277 rb.buf = (unsigned char*)malloc(sz);
3278 if (rb.buf==NULL) return rb;
3279 memset(rb.buf, 0, sz);
3280 rb.bufsz = sz;
3281 rb.state = JBXL_NORMAL;
3282 }
3283
3284 return rb;
3285}
3286
3287
3296{
3297 if (rb!=NULL) {
3298 freeNull(rb->buf);
3299 memset(rb, 0, sizeof(ringBuffer));
3300 rb->state = JBXL_NORMAL;
3301 }
3302}
3303
3304
3313{
3314 if (rb!=NULL) {
3315 int sz = rb->bufsz;
3316 unsigned char* ptr = rb->buf;
3317 memset(rb->buf, 0, rb->bufsz);
3318 memset(rb, 0, sizeof(ringBuffer));
3319 rb->buf = ptr;
3320 rb->state = JBXL_NORMAL;
3321 rb->bufsz = sz;
3322 }
3323}
3324
3325
3341int put_ringBuffer(ringBuffer* rb, unsigned char* pp, int sz)
3342{
3343 if (rb==NULL) return JBXL_ARGS_ERROR;
3344 rb->state = JBXL_NORMAL;
3345
3346 if (pp==NULL) return JBXL_ARGS_ERROR;
3347 if (rb->buf==NULL) return JBXL_TOOLS_BUF_ERROR;
3348 if (rb->datasz+sz>rb->bufsz) {
3349 rb->state = JBXL_ERROR;
3351 }
3352
3353 if (rb->epoint+sz<=rb->bufsz) {
3354 memcpy(&(rb->buf[rb->epoint]), pp, sz);
3355 rb->epoint = rb->epoint + sz;
3356 if (rb->epoint==rb->bufsz) rb->epoint = 0;
3357 }
3358 else {
3359 memcpy(&(rb->buf[rb->epoint]), pp, rb->bufsz-rb->epoint);
3360 memcpy(rb->buf, &(pp[rb->bufsz-rb->epoint]), sz-(rb->bufsz-rb->epoint));
3361 rb->epoint = rb->epoint + sz - rb->bufsz;
3362 }
3363
3364 rb->datasz += sz;
3365 return sz;
3366}
3367
3368
3382unsigned char* get_ringBuffer(ringBuffer* rb, int sz)
3383{
3384 unsigned char* pp;
3385
3386 if (rb==NULL) return NULL;
3387 if (rb->buf==NULL) return NULL;
3388 if (sz>rb->datasz) return NULL;
3389
3390 pp = (unsigned char*)malloc(sz+1);
3391 if (pp==NULL) return NULL;
3392 memset(pp, 0, sz+1);
3393
3394 if (rb->spoint+sz<=rb->bufsz) {
3395 memcpy(pp, &(rb->buf[rb->spoint]), sz);
3396 rb->spoint = rb->spoint + sz;
3397 if (rb->spoint==rb->bufsz) rb->spoint = 0;
3398 }
3399 else {
3400 memcpy(pp, &(rb->buf[rb->spoint]), rb->bufsz-rb->spoint);
3401 memcpy(&(pp[rb->bufsz-rb->spoint]), rb->buf, sz-(rb->bufsz-rb->spoint));
3402 rb->spoint = rb->spoint + sz - rb->bufsz;
3403 }
3404
3405 rb->datasz -= sz;
3406 return pp;
3407}
3408
3409
3424{
3425 if (rb==NULL) return FALSE;
3426 if (rb->buf==NULL) return FALSE;
3427 if (sz>rb->datasz) return FALSE;
3428
3429 if (rb->spoint+sz>=rb->bufsz) {
3430 rb->spoint = rb->spoint + sz - rb->bufsz;
3431 }
3432 else if (rb->spoint+sz<0) {
3433 rb->spoint = rb->bufsz + rb->spoint + sz;
3434 }
3435 else {
3436 rb->spoint = rb->spoint + sz;
3437 }
3438
3439 rb->datasz -= sz;
3440 return TRUE;
3441}
3442
3443
3454unsigned char* ref_ringBuffer(ringBuffer* rb, int pos)
3455{
3456 unsigned char* pp;
3457
3458 if (rb==NULL) return NULL;
3459 if (rb->buf==NULL) return NULL;
3460 if (pos>rb->datasz) return NULL;
3461
3462 int sz = rb->spoint + pos;
3463 pp = rb->buf + sz;
3464 if (sz >= rb->bufsz) pp -= rb->bufsz;
3465
3466 return pp;
3467}
3468
3469
3470
3472// バイト型 メッセージストリームバッファ
3473//
3474
3490int put_mstream(mstream* sb, unsigned char* mesg)
3491{
3492 int i, n, m, cc, np=0, len;
3493
3494 if (sb==NULL) return JBXL_ARGS_ERROR;
3495 sb->state = JBXL_NORMAL;
3496 if (mesg==NULL) return JBXL_ARGS_ERROR;
3497 if (sb->buf==NULL) return JBXL_TOOLS_BUF_ERROR;
3498
3499 len = (int)strlen((const char*)mesg);
3500 for (i=0, n=0, m=0; i<len; i++) {
3501 if (mesg[i]==CHAR_LF || (mesg[i]==CHAR_CR && mesg[i+1]!=CHAR_LF)) {
3502 if (m==0) m = i;
3503 n++;
3504 }
3505 }
3506 if (sb->datano==0 && n>=1) np = (sb->epoint + m + 1) % sb->bufsz;
3507
3508 cc = put_ringBuffer(sb, mesg, len);
3509 if (cc>=0) {
3510 if (sb->datano==0 && n>=1) sb->npoint = np;
3511 sb->datano += n;
3512 }
3513
3514 if (cc<0) sb->state = JBXL_ERROR;
3515 return cc;
3516}
3517
3518
3531unsigned char* get_mstream(mstream* sb)
3532{
3533 int n, len;
3534 unsigned char* pp;
3535
3536 if (sb==NULL) return NULL;
3537 sb->state = JBXL_NORMAL;
3538 if (sb->buf==NULL) return NULL;
3539 if (sb->datano==0) return NULL;
3540
3541 len = sb->npoint - sb->spoint;
3542 if (len==0) return NULL;
3543 else if (len<0) len += sb->bufsz;
3544
3545 pp = get_ringBuffer(sb, len);
3546 if (pp==NULL) {
3547 sb->state = JBXL_ERROR;
3548 return NULL;
3549 }
3550 chomp((char*)pp);
3551
3552 sb->datano += -1;
3553 sb->spoint = sb->npoint;
3554
3555 if (sb->datano>=1) {
3556 int m;
3557 n = sb->spoint;
3558 while (n!=sb->epoint) {
3559 m = (n + 1) % sb->bufsz;
3560 if (sb->buf[n]==CHAR_LF || (sb->buf[n]==CHAR_CR && sb->buf[m]!=CHAR_LF)) {
3561 sb->npoint = m;
3562 break;
3563 }
3564 n = m;
3565 }
3566 }
3567
3568 return pp;
3569}
3570
3571
3591unsigned char* fgets_mstream(unsigned char* mesg, mstream* sb)
3592{
3593 int state = JBXL_NORMAL;
3594 unsigned char* pp;
3595
3596 if (sb==NULL) return NULL;
3597 if (sb->buf==NULL) {
3598 *sb = make_mstream(RECVBUFSZ);
3599 if (sb->buf==NULL) return NULL;
3600 }
3601
3602 if (mesg!=NULL) put_mstream(sb, mesg);
3603 if (sb->state<0) state = sb->state;
3604
3605 if (sb->datano==0) {
3606 sb->state = JBXL_NODATA;
3607 return NULL;
3608 }
3609 pp = get_mstream(sb);
3610
3611 if (sb->state>=0 && state<0) sb->state = state;
3612 return pp;
3613}
3614
3615
3616
3618//
3619
3628unsigned char* uuid2guid(unsigned char* p)
3629{
3630 unsigned char* guid;
3631
3632 if (p==NULL) return NULL;
3633
3634 guid = (unsigned char*)malloc(LGUID); // 40 = 32+4+1(\0) + α
3635 if (guid==NULL) return NULL;
3636 memset(guid, 0, LGUID);
3637
3638 snprintf((char*)guid, 37, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
3639 p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8],p[9],p[10],p[11],p[12],p[13],p[14],p[15]);
3640
3641 return guid;
3642}
3643
3644
3654unsigned char* guid2uuid(unsigned char* p)
3655{
3656 int i, j;
3657 unsigned char* uuid;
3658
3659 if (p==NULL) return NULL;
3660
3661 uuid = (unsigned char*)malloc(16);
3662 if (uuid==NULL) return NULL;
3663 memset(uuid, 0, 16);
3664
3665 i = j = 0;
3666 while (p[i]!='\0' && j<16) {
3667 if (p[i]!='-' && p[i+1]!='\0') {
3668 unsigned char hb, lb;
3669
3670 if (p[i]>='0' && p[i]<='9') hb = p[i] - '0';
3671 else if (p[i]>='a' && p[i]<='f') hb = p[i] - 'a' + 10;
3672 else if (p[i]>='A' && p[i]<='F') hb = p[i] - 'A' + 10;
3673 else hb = '\0';
3674
3675 if (p[i+1]>='0' && p[i+1]<='9') lb = p[i+1] - '0';
3676 else if (p[i+1]>='a' && p[i+1]<='f') lb = p[i+1] - 'a' + 10;
3677 else if (p[i+1]>='A' && p[i+1]<='F') lb = p[i+1] - 'A' + 10;
3678 else lb = '\0';
3679
3680 uuid[j] = (hb<<4) + lb;
3681 i++;
3682 j++;
3683 }
3684 i++;
3685 }
3686
3687 return uuid;
3688}
3689
3690
3691
3693//
3694
3695#ifndef WIN32
3696
3702unsigned long int get_used_memory(void)
3703{
3704 struct sysinfo info;
3705 sysinfo(&info);
3706
3707 // キャッシュサイズが引けていない.
3708 unsigned long int mem = info.totalram - info.freeram - info.bufferram - info.sharedram;
3709 return mem*info.mem_unit/1024;
3710}
3711
3712
3718unsigned long int get_free_memory(void)
3719{
3720 struct sysinfo info;
3721 sysinfo(&info);
3722
3723 unsigned long int mem = info.freeram;
3724 return mem*info.mem_unit/1024;
3725}
3726
3727
3728void memory_check_start(void)
3729{
3730 UsedMemoryBase = get_used_memory();
3731}
3732
3733
3734unsigned long int memory_check(void)
3735{
3736 return get_used_memory() - UsedMemoryBase;
3737}
3738
3739
3740#endif
3741
3742
3743
3745// シグナル処理
3746//
3747#ifndef WIN32
3748
3749#ifdef SIGCHLD
3750
3762void set_sigterm_child(void (*handler)(int))
3763{
3764 struct sigaction sa;
3765
3766 memset(&sa, 0, sizeof(sa));
3767 if (handler!=NULL) sa.sa_handler = handler;
3768 else sa.sa_handler = sigterm_child;
3769
3770 sa.sa_flags = SA_NOCLDSTOP | SA_RESTART;
3771 sigemptyset(&sa.sa_mask);
3772 sigaddset(&sa.sa_mask, SIGINT); // SIGCHLD 処理中は SIGINT をブロック
3773 sigaddset(&sa.sa_mask, SIGHUP); // SIGCHLD 処理中は SIGHUP をブロック
3774 sigaddset(&sa.sa_mask, SIGTERM); // SIGCHLD 処理中は SIGTERM をブロック
3775 sigaction(SIGCHLD, &sa, NULL);
3776}
3777
3778
3786void sigterm_child(int signal)
3787{
3788 UNUSED(signal);
3789
3790 pid_t pid = 0;
3791 int ret;
3792
3793 //DEBUG_MODE PRINT_MESG("%d is waiting for children. signal = %d\n", getpid(), signal);
3794 //signal = 0; // dummy for warning of compiler
3795
3796 do { // チャイルドプロセスの終了を待つ
3797 pid = waitpid(-1, &ret, WNOHANG);
3798 } while(pid>0);
3799}
3800
3801
3807void ignore_sigterm_child()
3808{
3809 struct sigaction sa;
3810
3811 memset(&sa, 0, sizeof(sa));
3812 sa.sa_handler = SIG_IGN;
3813 sa.sa_flags = 0;
3814 sigemptyset(&sa.sa_mask);
3815 sigaction(SIGCHLD, &sa, NULL);
3816}
3817
3818
3828void set_sigsegv_handler(void (*handler)(int))
3829{
3830 struct sigaction sa;
3831
3832 memset(&sa, 0, sizeof(sa));
3833 if (handler!=NULL) sa.sa_handler = handler;
3834 else sa.sa_handler = trap_segmentation_falt;
3835
3836 sa.sa_flags = 0;
3837 sigemptyset(&sa.sa_mask);
3838 sigaction(SIGSEGV, &sa, NULL);
3839}
3840
3841
3849void trap_segmentation_falt(int signal)
3850{
3851 PRINT_MESG("****************************************************************\n");
3852 PRINT_MESG("* Segmentation Falt in [%d] !!!!!\n", getpid());
3853 PRINT_MESG("****************************************************************\n");
3854
3855 exit(signal);
3856}
3857
3858
3859#endif // SIGCHLD
3860
3861#endif // NOT WIN32
3862
3863
3865// for MS Windows
3866//
3867
3868#ifdef WIN32
3869
3870/* see common.h
3871
3872void bzero(char* p, unsigned int n)
3873{
3874 for (unsigned int i=0; i<n; i++) *(p++) = 0x00;
3875}
3876
3877
3878void bcopy(char* f, char* t, unsigned int n)
3879{
3880 for (unsigned int i=0; i<n; i++) *(t++) = *(f++);
3881}
3882*/
3883
3884#endif // WIN32
3885
3886
3887
3889// 入出力&DEBUG
3890//
3891
3892FILE* FP_LogFile = NULL;
3893FILE* FP_ErrFile = NULL;
3894
3895
3902{
3903 if (FP_LogFile!=NULL) return;
3904
3905 FP_LogFile = fopen(JBXL_LOG_FILE, "a");
3906 return;
3907}
3908
3909
3916{
3917 if (FP_LogFile==NULL) return;
3918
3919 fclose(FP_LogFile);
3920 FP_LogFile = NULL;
3921
3922 return;
3923}
3924
3925
3931void print_logfile(const char* fmt, ...)
3932{
3933 char* nfmt;
3934 int len;
3935 int slfopn = FALSE;
3936
3937 //
3938 if (FP_LogFile==NULL) {
3939 FP_LogFile = fopen(JBXL_LOG_FILE, "a");
3940 if (FP_LogFile==NULL) return;
3941 slfopn = TRUE;
3942 }
3943
3944 va_list args;
3945 va_start(args, fmt);
3946
3947 len = (int)strlen(fmt);
3948 nfmt = (char*)malloc(len + 2);
3949 if (nfmt==NULL) return;
3950
3951 strncpy(nfmt, fmt, len);
3952 nfmt[len] = '\n';
3953 nfmt[len+1] = '\0';
3954
3955 vfprintf(FP_LogFile, nfmt, args);
3956 fflush(FP_LogFile);
3957 free(nfmt);
3958
3959 va_end(args);
3960
3961 //
3962 if (slfopn && FP_LogFile!=NULL) {
3963 fclose(FP_LogFile);
3964 FP_LogFile = NULL;
3965 }
3966
3967 return;
3968}
3969
3970
3977{
3978 if (FP_ErrFile!=NULL) return;
3979
3980 FP_LogFile = fopen(JBXL_ERR_FILE, "a");
3981 return;
3982}
3983
3984
3991{
3992 if (FP_ErrFile==NULL) return;
3993
3994 fclose(FP_ErrFile);
3995 FP_ErrFile = NULL;
3996
3997 return;
3998}
3999
4000
4006void print_errfile(const char* fmt, ...)
4007{
4008 char* nfmt;
4009 int len;
4010 int slfopn = FALSE;
4011
4012 //
4013 if (FP_ErrFile==NULL) {
4014 FP_ErrFile = fopen(JBXL_ERR_FILE, "a");
4015 if (FP_ErrFile==NULL) return;
4016 slfopn = TRUE;
4017 }
4018
4019 va_list args;
4020 va_start(args, fmt);
4021
4022 len = (int)strlen(fmt);
4023 nfmt = (char*)malloc(len + 2);
4024 if (nfmt==NULL) return;
4025
4026 strncpy(nfmt, fmt, len);
4027 nfmt[len] = '\n';
4028 nfmt[len+1] = '\0';
4029
4030 vfprintf(FP_ErrFile, nfmt, args);
4031 fflush(FP_ErrFile);
4032 free(nfmt);
4033
4034 va_end(args);
4035
4036 //
4037 if (slfopn && FP_ErrFile!=NULL) {
4038 fclose(FP_ErrFile);
4039 FP_ErrFile = NULL;
4040 }
4041
4042 return;
4043}
4044
4045
4054void print_message(const char* fmt, ...)
4055{
4056 char* nfmt;
4057 int len;
4058
4059 va_list args;
4060 va_start(args, fmt);
4061
4062 len = (int)strlen(fmt);
4063 nfmt = (char*)malloc(len + 1);
4064 if (nfmt==NULL) return;
4065
4066 strncpy(nfmt, fmt, len);
4067 nfmt[len] = '\0';
4068
4069 vfprintf(stderr, nfmt, args);
4070 fflush(stderr);
4071 free(nfmt);
4072
4073 va_end(args);
4074
4075 return;
4076}
4077
4078
4088void fprint_message(FILE* fp, const char* fmt, ...)
4089{
4090 char* nfmt;
4091 int len;
4092
4093 va_list args;
4094 va_start(args, fmt);
4095
4096 len = (int)strlen(fmt);
4097 nfmt = (char*)malloc(len + 1);
4098 if (nfmt==NULL) return;
4099
4100 strncpy(nfmt, fmt, len);
4101 nfmt[len] = '\0';
4102
4103 vfprintf(fp, nfmt, args);
4104 fflush(fp);
4105 free(nfmt);
4106
4107 va_end(args);
4108
4109 return;
4110}
4111
4112
4124void print_escape(const char* fmt, char* mesg)
4125{
4126 char* pp;
4127
4128 if (fmt==NULL || mesg==NULL) return;
4129
4130 pp = change_esc(mesg);
4131 if (pp==NULL) return;
4132
4133 PRINT_MESG(fmt, pp);
4134 free(pp);
4135}
4136
4137
4151void fprint_escape(FILE* fp, char* fmt, char* mesg)
4152{
4153 char* pp;
4154
4155 if (fmt==NULL || mesg==NULL) return;
4156
4157 pp = change_esc(mesg);
4158 if (pp==NULL) return;
4159
4160 fprint_message(fp, fmt, pp);
4161 free(pp);
4162}
4163
4164
4176void fdump(FILE* fp, unsigned char* mesg, int n)
4177{
4178 int i, j, mod, len;
4179 char ascii[16];
4180
4181 if (fp==NULL) fp = stderr;
4182
4183 if (mesg==NULL) {
4184 fprintf(fp, "(Dump Data is NULL)\n");
4185 return;
4186 }
4187
4188 if (n<0) len = (int)strlen((const char*)mesg);
4189 else len = n;
4190
4191 memset(ascii, 0x2e, 16);
4192 for (i=0, j=0; i<len; i++) {
4193 fprintf(fp, "%02x ", mesg[i]);
4194 if (mesg[i]>=0x20 && mesg[i]<=0x7e) ascii[j] = mesg[i];
4195 j++;
4196 if (j==16) {
4197 fprintf(fp, " ");
4198 for (j=0; j<16; j++) {
4199 fprintf(fp, "%c ", ascii[j]);
4200 }
4201 fprintf(fp, "\n");
4202 memset(ascii, 0x2e, 16);
4203 j = 0;
4204 }
4205 }
4206
4207 mod = len%16;
4208 if (mod>0) {
4209 for (i=0; i<17-mod; i++) fprintf(fp, " ");
4210 for (i=0; i<mod; i++) fprintf(fp, "%c ", ascii[i]);
4211 }
4212 fprintf(fp, "\n");
4213}
4214
4215
4227void print_16x(FILE* fp, unsigned char* mesg, int n)
4228{
4229 int i, len;
4230
4231 if (fp==NULL) fp = stderr;
4232
4233 if (n<0) len = (int)strlen((const char*)mesg);
4234 else len = n;
4235
4236 for (i=0; i<len; i++) {
4237 fprintf(fp, "%02x", mesg[i]);
4238 }
4239 fprintf(fp, "\n");
4240}
4241
4242
4243
4245// グラフィック
4246//
4247
4249
4251{
4252 memset(_GraphicFileExtension, 0, L_OCT);
4253
4254 uWord file = tex & 0x00f0;
4255 if (file==JBXL_TEXTURE_JPEG) memcpy(_GraphicFileExtension, ".jpeg", 5);
4256 else if (file==JBXL_TEXTURE_TIFF) memcpy(_GraphicFileExtension, ".tiff", 5);
4257 else if (file==JBXL_TEXTURE_PNG) memcpy(_GraphicFileExtension, ".png", 4);
4258 else if (file==JBXL_TEXTURE_TGA) memcpy(_GraphicFileExtension, ".tga", 4);
4259 else if (file==JBXL_TEXTURE_JP2K) memcpy(_GraphicFileExtension, ".jp2", 4);
4260 else if (file==JBXL_TEXTURE_RAS) memcpy(_GraphicFileExtension, ".ras", 4);
4261
4262 return _GraphicFileExtension;
4263}
4264
4265
#define LNAME
Definition common.h:153
#define Min(x, y)
Definition common.h:250
#define OFF
Definition common.h:231
#define LGUID
16*2 + 4(-) + 1('\0') = 37 以上の 4の倍数
Definition common.h:159
unsigned short uWord
2Byte
Definition common.h:334
#define setBit(x, n, i)
Definition common.h:259
#define Max(x, y)
Definition common.h:247
#define JBXL_TEXTURE_PNG
0x0040
Definition common.h:324
#define RECVBUFSZ
256K
Definition common.h:134
#define JBXL_TEXTURE_TGA
0x0050
Definition common.h:325
#define UNUSED(x)
Definition common.h:264
#define JBXL_TEXTURE_TIFF
0x0030
Definition common.h:323
#define mkdir(d, m)
Definition common.h:61
#define snprintf
Definition common.h:56
#define TRUE
Definition common.h:226
#define FALSE
Definition common.h:223
#define JBXL_TEXTURE_RAS
0x0070 SUN RASTER 8bit
Definition common.h:327
#define L_OCT
Definition common.h:168
unsigned char uByte
1Byte
Definition common.h:332
#define WIN_DD_NULL
Definition common.h:96
#define strncasecmp
Definition common.h:59
#define strcasecmp
Definition common.h:58
#define mode_t
Definition common.h:63
#define ON
Definition common.h:230
#define LDATA
Definition common.h:151
#define JBXL_TEXTURE_JP2K
0x0060
Definition common.h:326
#define JBXL_TEXTURE_JPEG
0x0020
Definition common.h:321
#define getBit(x, n)
Definition common.h:258
JunkBox_Lib 状態ヘッダ
#define JBXL_FILE_EXIST_ERROR
ファイルが存在しない(シンボリックリンクもダメ).または既に存在する.
Definition jbxl_state.h:48
#define JBXL_ERROR
エラー
Definition jbxl_state.h:34
#define JBXL_ARGS_ERROR
不正な引数(NULLなど)
Definition jbxl_state.h:42
#define JBXL_TOOLS_BUFSZ_ERROR
バッファ(データ格納)部の大きさが足りない
Definition jbxl_state.h:57
#define JBXL_DIR_MAKE_ERROR
ディレクトリ作成エラー
Definition jbxl_state.h:53
#define JBXL_NORMAL
正常
Definition jbxl_state.h:32
#define JBXL_NODATA
有効なデータが無い
Definition jbxl_state.h:35
#define JBXL_FILE_DESTOPEN_ERROR
ディスティネーションファイルのオープン失敗
Definition jbxl_state.h:50
#define JBXL_MALLOC_ERROR
メモリ確保エラー
Definition jbxl_state.h:41
#define JBXL_FILE_OPEN_ERROR
ファイルオープン エラー
Definition jbxl_state.h:44
#define JBXL_TOOLS_BUF_ERROR
バッファ(データ格納)部の領域がない
Definition jbxl_state.h:56
int bufsz
バッファ部のサイズ
Definition tools.h:157
int datasz
保存されているデータの全体の長さ
Definition tools.h:160
int state
リングバッファの状態
Definition tools.h:163
unsigned char * buf
バッファ
Definition tools.h:156
int spoint
バッファデータの開始点
Definition tools.h:158
int epoint
バッファデータの終点+1 (データの追加点)
Definition tools.h:159
static char _ToSTR[LDATA]
作業用(文字変換)
Definition tools.cpp:1410
char * ultostr_ts(unsigned long int n)
Definition tools.cpp:1572
int put_mstream(mstream *sb, unsigned char *mesg)
メッセージ(文字列)ストリーム sb へメッセージ(の一部)を格納する
Definition tools.cpp:3490
char * awk(char *buf, char cc, int n)
ccを区切り記号として, strのバッファ内の n番目の項目を返す.要 free()
Definition tools.cpp:567
unsigned char * uuid2guid(unsigned char *p)
uuid を guid に変換する.要 free()
Definition tools.cpp:3628
unsigned int uint_from_little_endian(void *ptr)
Definition tools.cpp:210
double double_from_big_endian(void *ptr)
Definition tools.cpp:264
unsigned char * get_mstream(mstream *sb)
メッセージ(文字列)ストリーム sb から次のメッセージを取り出す.改行コードは削除される.
Definition tools.cpp:3531
unsigned char * decode_quoted_printable(unsigned char *buf, int *sz)
buf を quoted printableからデコードする.要 free()
Definition tools.cpp:3029
int file_exist(const char *fn)
ファイルの存在を検査する.
Definition tools.cpp:2337
unsigned char * encode_urlenc(unsigned char *buf, int sz)
バイナリデータ bufを URLエンコードする.要 free()
Definition tools.cpp:2979
char * del_file_extension(const char *str)
フルパスを書き換えて拡張子を削除する.free() してはいけない.
Definition tools.cpp:2256
void sjis2euc(unsigned char *c1, unsigned char *c2)
SJIS -> EUC.
Definition tools.cpp:2716
unsigned short ushort_from_little_endian(void *ptr)
Definition tools.cpp:246
unsigned long long int ntohull(unsigned long long int s)
Definition tools.cpp:1824
int strnrvscmp(const char *s1, const char *s2, int n)
文字列 s1と s2を後ろから n文字比較する.一致するなら 0
Definition tools.cpp:674
char * dup_str(char *buf)
文字列を複製する.要 free()
Definition tools.cpp:1368
FILE * file_chmod_open(const char *fn, const char *fm, mode_t mode)
ファイルの許可属性をmode へ変更した後,ファイルを fmモードでオープン
Definition tools.cpp:2366
unsigned char * encode_quoted_printable(unsigned char *buf, int sz)
バイナリデータ bufを quoted printable にエンコードする.要 free()
Definition tools.cpp:3074
unsigned long int file_size(const char *fn)
ファイルの大きさを返す.
Definition tools.cpp:2309
ringBuffer init_ringBuffer()
リングバッファを初期化する.
Definition tools.cpp:3250
unsigned char decode_hex(unsigned char pp1, unsigned char pp2)
16進コードをキャラクタに変換する.O-9,A-F以外が指定された場合は0とみなす. 内容を書き換える.
Definition tools.cpp:3171
char * ltostr_ts(long int n)
long int を文字に変換する.要 free()
Definition tools.cpp:1552
int fp_from_to(FILE *src, FILE *dst, long int sz)
ファイル sを dにコピーする.
Definition tools.cpp:2035
void print_logfile(const char *fmt,...)
デフォルトのログファイルにデータを書き込む
Definition tools.cpp:3931
void close_errfile(void)
デフォルトのエラーファイルをクローズする
Definition tools.cpp:3990
char * ltostr(long int n)
long int を文字に変換する.free() は不要
Definition tools.cpp:1436
unsigned char * encode_base64_filename(unsigned char *buf, int sz, unsigned char cc)
バイナリデータ bufを Base64で encodeしてファイル名を作る.ただし '/' は cc として扱う.要 free()
Definition tools.cpp:2907
short short_from_big_endian(void *ptr)
Definition tools.cpp:336
void open_logfile(void)
デフォルトのログファイルをオープンする
Definition tools.cpp:3901
void open_errfile(void)
デフォルトのエラーファイルをオープンする
Definition tools.cpp:3976
void free_ringBuffer(ringBuffer *rb)
リングバッファを解放する.make_ringBuffer() と対.
Definition tools.cpp:3295
void print_message(const char *fmt,...)
バッファリングなしのメッセージ出力(stderr)
Definition tools.cpp:4054
char * temp_filename(const char *dir, int flen)
/dev/urandom を利用して作業用ファイルのランダムなファイル名を得る.
Definition tools.cpp:2397
unsigned char * guid2uuid(unsigned char *p)
guid を uuid に変換する.要 free()
Definition tools.cpp:3654
unsigned char LocalIPNum6[16]
::1 のバイナリ
Definition tools.cpp:27
unsigned char * ref_ringBuffer(ringBuffer *rb, int pos)
spoint 地点から pos番目のデータへの参照.posは 0から数える.spoint は変化しない.
Definition tools.cpp:3454
static char _GraphicFileExtension[L_OCT]
Definition tools.cpp:4248
int bincmp(unsigned char *b1, unsigned char *b2, int n)
バイナリデータを n Byte比べる.一致するなら 0
Definition tools.cpp:650
void kanji_convert_sjis2euc(unsigned char *mesg)
SJISをEUCに変換する.
Definition tools.cpp:2664
char * numbering_name(const char *fmt, int n)
フォーマット fmtに従って,nを含む文字列を作り出す.要 free()
Definition tools.cpp:2598
void swap_byte(void *p, int s, int c)
sの長さのpのバイト順序をbバイト毎に逆順にする.
Definition tools.cpp:1854
int file_from_to(const char *src, const char *dst, const char *mode)
modeに従って,ファイル sを dにコピーする.
Definition tools.cpp:1985
int ex_strncmp(const char *dat, const char *key, int len)
文字列 s1とs2を拡張比較する.一致するなら TRUE
Definition tools.cpp:784
long unsigned int write_file(const char *fname, unsigned char *buf, long unsigned int size)
ファイルにデータを書き込む
Definition tools.cpp:2497
void fprint_escape(FILE *fp, char *fmt, char *mesg)
Definition tools.cpp:4151
char * get_file_path(const char *str)
ファイル名を含むパスからパスのみを生成する.strは変化しない.要 free().
Definition tools.cpp:2191
char * get_line(char *buf, int n)
文字型データbufのバッファ内の n行目を取り出す.改行コードは削除される.要 free()
Definition tools.cpp:484
int ex_strnrvscmp(const char *dat, const char *key, int len)
文字列 s1とs2を後ろから拡張比較する.一致するなら TRUE
Definition tools.cpp:856
int is_number(unsigned char *str)
数字かどうか判定する(簡易版).整数(1) と小数点付き数字(2) のみ.
Definition tools.cpp:1394
char * randstr(int n)
ランダムに A-Za-z0-9 までの文字を n文字生成する.
Definition tools.cpp:1777
int seek_ringBuffer(ringBuffer *rb, int sz)
リングバッファのデータポインタを seek する.
Definition tools.cpp:3423
int UnitTestMode
ユニット単体でのテストを行う場合に使用する.デフォルトは OFF.
Definition tools.cpp:18
float float_from_big_endian(void *ptr)
Definition tools.cpp:282
char * ultostr(unsigned long int n)
Definition tools.cpp:1452
char * itostr_ts(int n)
int を文字に変換する.要 free()
Definition tools.cpp:1532
void close_logfile(void)
デフォルトのログファイルをクローズする
Definition tools.cpp:3915
int ex_strncasecmp(const char *dat, const char *key, int len)
文字列 s1とs2を拡張比較する.大文字小文字を区別しない.一致するなら TRUE
Definition tools.cpp:820
char * get_local_timestamp(time_t date, const char *format)
要 free()
Definition tools.cpp:440
int int_from_little_endian(void *ptr)
Definition tools.cpp:192
unsigned char * encode_hex(unsigned char cc)
キャラクタを16進コードの文字列に変換する.要 free()
Definition tools.cpp:3138
int put_ringBuffer(ringBuffer *rb, unsigned char *pp, int sz)
リングバッファにデータを格納する.
Definition tools.cpp:3341
void fprint_message(FILE *fp, const char *fmt,...)
バッファリングなしのメッセージ出力
Definition tools.cpp:4088
char * ftostr_ts(float n)
float を文字に変換する.要 free()
Definition tools.cpp:1632
char * cawk(char *buf, char cc, int n)
連続するccを区切り記号として, strのバッファ内の n番目の項目を返す.要 free()
Definition tools.cpp:609
ringBuffer make_ringBuffer(int sz)
バッファ部が存在するリングバッファを作り出す.
Definition tools.cpp:3270
char * itostr(int n)
int を文字に変換する.free() は不要
Definition tools.cpp:1420
void reverse_str(uByte *p, int s)
バイト(octet)列を逆順にする.
Definition tools.cpp:1952
unsigned char * read_file(const char *fname, long unsigned int *size)
ファイルからデータを読み込む
Definition tools.cpp:2460
char * lltostr(long long int n)
long long int を文字に変換する.free() は不要
Definition tools.cpp:1468
char * lltostr_ts(long long int n)
long long int を文字に変換する.要 free()
Definition tools.cpp:1592
unsigned char * fgets_mstream(unsigned char *mesg, mstream *sb)
メッセージストリームからメッセージを一行だけ取り出す.
Definition tools.cpp:3591
unsigned char * randbit(int n)
ランダムに n bitのバイナリを生成する.
Definition tools.cpp:1804
char * pack_char_len(char *mesg, char cc, int len)
文字列の一部の先頭のcc(複数),終わりのcc(複数),CR, LF を削除.要 free()
Definition tools.cpp:1154
int ex_strncaservscmp(const char *dat, const char *key, int len)
文字列 s1とs2を後ろから拡張比較する.一致するなら TRUE
Definition tools.cpp:892
char * strstrcase(const char *buf, const char *nd)
文字列 bufの中に文字列 ndがあるかどうかをチェックする.大文字小文字は区別しない.
Definition tools.cpp:736
void print_16x(FILE *fp, unsigned char *mesg, int n)
16進ダンプを吐き出す(1行)
Definition tools.cpp:4227
unsigned long int UsedMemoryBase
メモリチェック用
Definition tools.cpp:23
char * ulltostr_ts(unsigned long long int n)
Definition tools.cpp:1612
char * get_file_name(const char *str)
フルパスからファイル名へのポインタを取り出す.free() してはいけない.
Definition tools.cpp:2066
void fdump(FILE *fp, unsigned char *mesg, int n)
16進ダンプを吐き出す
Definition tools.cpp:4176
int int_from_big_endian(void *ptr)
Definition tools.cpp:300
char * cut_file_extension(const char *str)
拡張子を削除したフパス名を生成する.strは変化しない.要 free().
Definition tools.cpp:2282
void clear_ringBuffer(ringBuffer *rb)
リングバッファのデータを削除する.
Definition tools.cpp:3312
char * cut_str(char *buf, int ls, int le)
buf[ls]〜buf[le] を切り出す.要 free()
Definition tools.cpp:1338
char * ftostr(float n)
float を文字に変換する.free() は不要
Definition tools.cpp:1500
char * skip_char_pair(char *pp, char pair, char end)
pair と end で閉じるまでポインタをスキップさせる.ただし クォーテーション内は完全スキップ
Definition tools.cpp:1022
int KanjiCode
システムの漢字コード
Definition tools.cpp:20
void kanji_convert(unsigned char *mesg)
大域変数 KnjiCodeに従って漢字コードを変換する.
Definition tools.cpp:2629
int HostEndian
システムの Endian
Definition tools.cpp:21
void upper_string(char *str)
Definition tools.cpp:2756
char * get_seq_data(char *buf, int *ptr)
文字型データbufのバッファ内の 行データをシーケンシャルに取り出す.
Definition tools.cpp:529
short swaps(unsigned short p)
16bit の上下8bitを入れ替える.
Definition tools.cpp:1872
int strncaservscmp(const char *s1, const char *s2, int n)
文字列 s1と s2を後ろから n文字比較する.大文字小文字は区別しない.一致するなら 0
Definition tools.cpp:703
char * change_esc(char *mesg)
文字列中の CR, LF を \r, \n に変換する.要 free()
Definition tools.cpp:1210
unsigned char LocalIPNum[4]
127.0.0.1 のバイナリ
Definition tools.cpp:26
char * get_gmt_timestamp(time_t date, const char *format)
要 free()
Definition tools.cpp:454
void euc2sjis(unsigned char *c1, unsigned char *c2)
EUC -> SJIS.
Definition tools.cpp:2687
unsigned char * decode_base64_filename(unsigned char *buf, int *sz, unsigned char cc)
bufを Base64で decodeしてバイナリデータを取り出す.ただし cc は '/' として扱う.要 free()
Definition tools.cpp:2887
int mkdirp(const char *path, mode_t mode)
mkdir -p path 相当.
Definition tools.cpp:2511
void print_escape(const char *fmt, char *mesg)
エスケープ文字を含むメッセージの出力(stderr)
Definition tools.cpp:4124
void del_ringBuffer(ringBuffer **rb)
リングバッファそのものを削除する.new_ringBuffer() と対.
Definition tools.cpp:3232
long long int swapd(unsigned long long int p)
Definition tools.cpp:1923
FILE * FP_ErrFile
Definition tools.cpp:3893
unsigned char * get_ringBuffer(ringBuffer *rb, int sz)
リングバッファからデータを得る.要 free()
Definition tools.cpp:3382
FILE * FP_LogFile
Definition tools.cpp:3892
char * skip_chars(char *pp, const char *check)
check[]中の何れかの文字までポインタをスキップさせる.ただし クォーテーション内は完全スキップ
Definition tools.cpp:948
void replace_char(unsigned char *buf, int len, unsigned char frm, unsigned char toc)
データbuf 中のバイトデータ frm を tocに変更する.
Definition tools.cpp:1252
void check_endian(void)
システムのエンディアンを判別して,大域変数 HostEndian に設定する
Definition tools.cpp:143
char * dtostr(double n)
double を文字に変換する.free() は不要
Definition tools.cpp:1516
char * get_graphic_extension(uWord tex)
Definition tools.cpp:4250
unsigned char * encode_base64(unsigned char *buf, int sz)
バイナリデータ bufを base64にエンコードする.要 free()
Definition tools.cpp:2848
char * pack_head_tail_char(char *mesg, char cc)
文字の先頭のcc(複数),TAB, CR, LF.終わりのcc(複数),TAB, CR, LF を削除.要 free()
Definition tools.cpp:1092
int isNull(void *p)
Definition tools.cpp:51
int count_lines(const char *buf)
文字列データの行数を数える.行頭が '\0'の場合も1行と数える.
Definition tools.cpp:1673
unsigned char * decode_base64(unsigned char *buf, int *sz)
bufを base64からデコードする.要 free()
Definition tools.cpp:2786
int is_big_endian(void)
エンディアンの動的チェック
Definition tools.cpp:114
short short_from_little_endian(void *ptr)
Definition tools.cpp:228
char * skip_char(char *pp, char cc)
cc の文字までポインタをスキップさせる.ただし クォーテーション内は完全スキップ
Definition tools.cpp:985
unsigned char * decode_urlenc(unsigned char *buf, int *sz)
buf を URLエンコードからデコードする.要 free()
Definition tools.cpp:2932
int is_little_endian(void)
エンディアンの動的チェック
Definition tools.cpp:80
unsigned int uint_from_big_endian(void *ptr)
Definition tools.cpp:318
void print_errfile(const char *fmt,...)
デフォルトのエラーファイルにデータを書き込む
Definition tools.cpp:4006
void kanji_convert_euc2sjis(unsigned char *mesg)
EUCをSJISに変換する.
Definition tools.cpp:2644
char * get_file_extension(const char *str)
フルパスからファイル名の拡張子へのポインタを取り出す.free() してはいけない.
Definition tools.cpp:2225
ringBuffer * new_ringBuffer(int sz)
リングバッファを生成する.
Definition tools.cpp:3204
float float_from_little_endian(void *ptr)
Definition tools.cpp:174
char * chomp(char *buf)
最初の改行コード以降を無効にする.
Definition tools.cpp:921
char * del_file_name(const char *str)
フルパスを書き換えてファイル名部分を削除する.free() してはいけない.
Definition tools.cpp:2094
int DebugMode
ON の場合 ライブラリ全体がデバックモードであることを示す.デフォルトは OFF.
Definition tools.cpp:17
char * ulltostr(unsigned long long int n)
Definition tools.cpp:1484
int swapl(unsigned int p)
32bit pを8bitづつ逆順にする
Definition tools.cpp:1896
char * dtostr_ts(double n)
double を文字に変換する.要 free()
Definition tools.cpp:1652
unsigned short ushort_from_big_endian(void *ptr)
Definition tools.cpp:354
int hexstr2i(const char *str)
16進の文字列を整数に変換する.
Definition tools.cpp:1706
double double_from_little_endian(void *ptr)
エンディアンによるデータ変換
Definition tools.cpp:156
char * skip_string_end(char *pp)
次の文字列を一つスキップする.最期のクォーテーションの位置を返す.
Definition tools.cpp:1060
char * replace_str(char *buf, int len, const char *frm, const char *tos)
文字列 buf中の frmを tosに書き換えたものを返す.free() してはいけない.
Definition tools.cpp:1282
char * double_bs(char *str)
文字列中の \ を \\に置き換えた文字列を返す.要 free()
Definition tools.cpp:2564
汎用ツールヘッダ
#define mstream
バイト型 メッセージストリーム
Definition tools.h:167
#define BIG_ENDIAN
Definition tools.h:92
#define JBXL_ERR_FILE
デフォルトのエラーファイル
Definition tools.h:441
#define CHAR_TAB
タブ
Definition tools.h:80
#define PRINT_MESG(...)
環境依存用の出力関数.MS Windows用は未実装
Definition tools.h:469
#define LITTLE_ENDIAN
Definition tools.h:91
void init_rand(void)
/dev/urandom からデータで乱数の系列を初期化する
#define JBXL_LOG_FILE
デフォルトのログファイル
Definition tools.h:440
#define make_mstream(s)
make_ringBuffer()
Definition tools.h:385
#define CHAR_CR
改行
Definition tools.h:78
#define CHAR_LF
ラインフィード
Definition tools.h:79
#define CODE_SJIS
Definition tools.h:85
#define UNKNOWN_ENDIAN
Definition tools.h:88
#define CODE_UTF8
Definition tools.h:86