汎用ツールプログラム More...
#include "tools.h"
#include "jbxl_state.h"
Go to the source code of this file.
Functions | |
int | isNull (void *p) |
int | is_little_endian (void) |
エンディアンの動的チェック | |
int | is_big_endian (void) |
エンディアンの動的チェック | |
void | check_endian (void) |
システムのエンディアンを判別して,大域変数 HostEndian に設定する | |
double | double_from_little_endian (void *ptr) |
エンディアンによるデータ変換 | |
float | float_from_little_endian (void *ptr) |
int | int_from_little_endian (void *ptr) |
unsigned int | uint_from_little_endian (void *ptr) |
short | short_from_little_endian (void *ptr) |
unsigned short | ushort_from_little_endian (void *ptr) |
double | double_from_big_endian (void *ptr) |
float | float_from_big_endian (void *ptr) |
int | int_from_big_endian (void *ptr) |
unsigned int | uint_from_big_endian (void *ptr) |
short | short_from_big_endian (void *ptr) |
unsigned short | ushort_from_big_endian (void *ptr) |
char * | get_local_timestamp (time_t date, const char *format) |
要 free() | |
char * | get_gmt_timestamp (time_t date, const char *format) |
要 free() | |
char * | get_line (char *buf, int n) |
文字型データbufのバッファ内の n行目を取り出す.改行コードは削除される.要 free() | |
char * | get_seq_data (char *buf, int *ptr) |
文字型データbufのバッファ内の 行データをシーケンシャルに取り出す. | |
char * | awk (char *buf, char cc, int n) |
ccを区切り記号として, strのバッファ内の n番目の項目を返す.要 free() | |
char * | cawk (char *buf, char cc, int n) |
連続するccを区切り記号として, strのバッファ内の n番目の項目を返す.要 free() | |
int | bincmp (unsigned char *b1, unsigned char *b2, int n) |
バイナリデータを n Byte比べる.一致するなら 0 | |
int | strnrvscmp (const char *s1, const char *s2, int n) |
文字列 s1と s2を後ろから n文字比較する.一致するなら 0 | |
int | strncaservscmp (const char *s1, const char *s2, int n) |
文字列 s1と s2を後ろから n文字比較する.大文字小文字は区別しない.一致するなら 0 | |
char * | strstrcase (const char *buf, const char *nd) |
文字列 bufの中に文字列 ndがあるかどうかをチェックする.大文字小文字は区別しない. | |
int | ex_strncmp (const char *dat, const char *key, int len) |
文字列 s1とs2を拡張比較する.一致するなら TRUE | |
int | ex_strncasecmp (const char *dat, const char *key, int len) |
文字列 s1とs2を拡張比較する.大文字小文字を区別しない.一致するなら TRUE | |
int | ex_strnrvscmp (const char *dat, const char *key, int len) |
文字列 s1とs2を後ろから拡張比較する.一致するなら TRUE | |
int | ex_strncaservscmp (const char *dat, const char *key, int len) |
文字列 s1とs2を後ろから拡張比較する.一致するなら TRUE | |
char * | chomp (char *buf) |
最初の改行コード以降を無効にする. | |
char * | skip_chars (char *pp, const char *check) |
check[]中の何れかの文字までポインタをスキップさせる.ただし クォーテーション内は完全スキップ | |
char * | skip_char (char *pp, char cc) |
cc の文字までポインタをスキップさせる.ただし クォーテーション内は完全スキップ | |
char * | skip_char_pair (char *pp, char pair, char end) |
pair と end で閉じるまでポインタをスキップさせる.ただし クォーテーション内は完全スキップ | |
char * | skip_string_end (char *pp) |
次の文字列を一つスキップする.最期のクォーテーションの位置を返す. | |
char * | pack_head_tail_char (char *mesg, char cc) |
文字の先頭のcc(複数),TAB, CR, LF.終わりのcc(複数),TAB, CR, LF を削除.要 free() | |
char * | pack_char_len (char *mesg, char cc, int len) |
文字列の一部の先頭のcc(複数),終わりのcc(複数),CR, LF を削除.要 free() | |
char * | change_esc (char *mesg) |
文字列中の CR, LF を \r, \n に変換する.要 free() | |
char * | replace_str (char *buf, int len, const char *frm, const char *tos) |
文字列 buf中の frmを tosに書き換えたものを返す.free() してはいけない. | |
char * | cut_str (char *buf, int ls, int le) |
buf[ls]〜buf[le] を切り出す.要 free() | |
char * | dup_str (char *buf) |
文字列を複製する.要 free() | |
char * | itostr (int n) |
int を文字に変換する.free() は不要 | |
char * | ltostr (long int n) |
long int を文字に変換する.free() は不要 | |
char * | ultostr (unsigned long int n) |
unsigned long int を文字に変換する.free() は不要 | |
char * | lltostr (long long int n) |
long long int を文字に変換する.free() は不要 | |
char * | ulltostr (unsigned long long int n) |
unsigned long long int を文字に変換する.free() は不要 | |
char * | ftostr (float n) |
float を文字に変換する.free() は不要 | |
char * | dtostr (double n) |
double を文字に変換する.free() は不要 | |
char * | itostr_ts (int n) |
int を文字に変換する.要 free() | |
char * | ltostr_ts (long int n) |
long int を文字に変換する.要 free() | |
char * | ultostr_ts (unsigned long int n) |
unsigned long int を文字に変換する.要 free() | |
char * | lltostr_ts (long long int n) |
long long int を文字に変換する.要 free() | |
char * | ulltostr_ts (unsigned long long int n) |
unsigned long long int を文字に変換する.要 free() | |
char * | ftostr_ts (float n) |
float を文字に変換する.要 free() | |
char * | dtostr_ts (double n) |
double を文字に変換する.要 free() | |
int | count_lines (const char *buf) |
文字列データの行数を数える.行頭が '\0'の場合も1行と数える. | |
int | hexstr2i (const char *str) |
16進の文字列を整数に変換する. | |
void | init_rand (void) |
/dev/urandom からデータで乱数の系列を初期化する | |
char * | randstr (int n) |
ランダムに A-Za-z0-9 までの文字を n文字生成する. | |
unsigned char * | randbit (int n) |
ランダムに n bitのバイナリを生成する. | |
unsigned long long int | ntohull (unsigned long long int s) |
Network形式からHost形式へ,64bit unsigned long long int データの変換. | |
void | swap_byte (void *p, int s, int c) |
sの長さのpのバイト順序をbバイト毎に逆順にする. | |
short | swaps (unsigned short p) |
16bit の上下8bitを入れ替える. | |
int | swapl (unsigned int p) |
32bit pを8bitづつ逆順にする | |
void | reverse_str (uByte *p, int s) |
バイト(octet)列を逆順にする. | |
int | file_from_to (const char *src, const char *dst, const char *mode) |
modeに従って,ファイル sを dにコピーする. | |
int | fp_from_to (FILE *src, FILE *dst, long int sz) |
ファイル sを dにコピーする. | |
char * | get_file_name (const char *str) |
フルパスからファイル名へのポインタを取り出す.free() してはいけない. | |
char * | del_file_name (const char *str) |
フルパスを書き換えてファイル名部分を削除する.free() してはいけない. | |
char * | get_file_path (const char *str) |
ファイル名を含むパスからパスのみを生成する.strは変化しない.要 free(). | |
char * | get_file_extension (const char *str) |
フルパスからファイル名の拡張子へのポインタを取り出す.free() してはいけない. | |
char * | del_file_extension (const char *str) |
フルパスを書き換えて拡張子を削除する.free() してはいけない. | |
char * | cut_file_extension (const char *str) |
拡張子を削除したフパス名を生成する.strは変化しない.要 free(). | |
unsigned long int | file_size (const char *fn) |
ファイルの大きさを返す. | |
int | file_exist (const char *fn) |
ファイルの存在を検査する. | |
FILE * | file_chmod_open (const char *fn, const char *fm, mode_t mode) |
ファイルの許可属性をmode へ変更した後,ファイルを fmモードでオープン | |
char * | temp_filename (const char *dir, int flen) |
/dev/urandom を利用して作業用ファイルのランダムなファイル名を得る. | |
unsigned char * | read_file (const char *fname, unsigned long int *size) |
ファイルからデータを読み込む | |
long int | write_file (const char *fname, unsigned char *buf, unsigned long int size) |
ファイルにデータを書き込む | |
char * | double_bs (char *str) |
文字列中の \ を \\に置き換えた文字列を返す.要 free() | |
char * | numbering_name (const char *fmt, int n) |
フォーマット fmtに従って,nを含む文字列を作り出す.要 free() | |
void | kanji_convert (unsigned char *mesg) |
大域変数 KnjiCodeに従って漢字コードを変換する. | |
void | kanji_convert_euc2sjis (unsigned char *mesg) |
EUCをSJISに変換する.. | |
void | kanji_convert_sjis2euc (unsigned char *mesg) |
SJISをEUCに変換する.. | |
void | euc2sjis (unsigned char *c1, unsigned char *c2) |
EUC -> SJIS. | |
void | sjis2euc (unsigned char *c1, unsigned char *c2) |
SJIS -> EUC. | |
void | upper_string (char *str) |
unsigned char * | decode_base64 (unsigned char *buf, int *sz) |
bufを base64からデコードする.要 free() | |
unsigned char * | encode_base64 (unsigned char *buf, int sz) |
バイナリデータ bufを base64にエンコードする.要 free() | |
unsigned char * | decode_base64_filename (unsigned char *buf, int *sz) |
bufを Base64で decodeしてバイナリデータを取り出す.ただし '$' は '/' として扱う.要 free() | |
unsigned char * | encode_base64_filename (unsigned char *buf, int sz) |
バイナリデータ bufを Base64で encodeしてファイル名を作る.ただし '/' は '$' として扱う.要 free() | |
unsigned char * | decode_urlenc (unsigned char *buf, int *sz) |
buf を URLエンコードからデコードする.要 free() | |
unsigned char * | encode_urlenc (unsigned char *buf, int sz) |
バイナリデータ bufを URLエンコードする.要 free() | |
unsigned char * | decode_quoted_printable (unsigned char *buf, int *sz) |
buf を quoted printableからデコードする.要 free() | |
unsigned char * | encode_quoted_printable (unsigned char *buf, int sz) |
バイナリデータ bufを quoted printable にエンコードする.要 free() | |
unsigned char * | encode_hex (unsigned char cc) |
キャラクタを16進コードの文字列に変換する.要 free() | |
unsigned char | decode_hex (unsigned char pp1, unsigned char pp2) |
16進コードをキャラクタに変換する.O-9,A-F以外が指定された場合は0とみなす. 内容を書き換える. | |
ringBuffer * | new_ringBuffer (int sz) |
リングバッファを生成する. | |
void | del_ringBuffer (ringBuffer **rb) |
リングバッファそのものを削除する.new_ringBuffer() と対. | |
ringBuffer | init_ringBuffer () |
リングバッファを初期化する. | |
ringBuffer | make_ringBuffer (int sz) |
バッファ部が存在するリングバッファを作り出す. | |
void | free_ringBuffer (ringBuffer *rb) |
リングバッファを解放する.make_ringBuffer() と対. | |
void | clear_ringBuffer (ringBuffer *rb) |
リングバッファのデータを削除する. | |
int | put_ringBuffer (ringBuffer *rb, unsigned char *pp, int sz) |
リングバッファにデータを格納する. | |
unsigned char * | get_ringBuffer (ringBuffer *rb, int sz) |
リングバッファからデータを得る.要 free() | |
int | seek_ringBuffer (ringBuffer *rb, int sz) |
リングバッファのデータポインタを seek する. | |
unsigned char * | ref_ringBuffer (ringBuffer *rb, int pos) |
spoint 地点から pos番目のデータへの参照.posは 0から数える.spoint は変化しない. | |
int | put_mstream (mstream *sb, unsigned char *mesg) |
メッセージ(文字列)ストリーム sb へメッセージ(の一部)を格納する | |
unsigned char * | get_mstream (mstream *sb) |
メッセージ(文字列)ストリーム sb から次のメッセージを取り出す.改行コードは削除される. | |
unsigned char * | fgets_mstream (unsigned char *mesg, mstream *sb) |
メッセージストリームからメッセージを一行だけ取り出す. | |
unsigned char * | uuid2guid (unsigned char *p) |
uuid を guid に変換する.要 free() | |
unsigned char * | guid2uuid (unsigned char *p) |
guid を uuid に変換する.要 free() | |
unsigned long int | get_used_memory (void) |
使用中のメモリサイズを得る. | |
unsigned long int | get_free_memory (void) |
未使用のメモリサイズを得る. | |
void | set_sigterm_child (void(*handler)(int)) |
child プロセス終了時の処理を設定. | |
void | sigterm_child (int signal) |
child プロセス終了時の処理 | |
void | ignore_sigterm_child () |
以後 child プロセスの終了を無視する. | |
void | set_sigsegv_handler (void(*handler)(int)) |
セグメンテーションエラー時のハンドラを設定 | |
void | trap_segmentation_falt (int signal) |
セグメンテーションエラー時にデフォルトで呼び出される関数. | |
void | open_logfile (void) |
デフォルトのログファイルをオープンする | |
void | close_logfile (void) |
デフォルトのログファイルをクローズする | |
void | print_logfile (const char *fmt,...) |
デフォルトのログファイルにデータを書き込む | |
void | open_errfile (void) |
デフォルトのエラーファイルをオープンする | |
void | close_errfile (void) |
デフォルトのエラーファイルをクローズする | |
void | print_errfile (const char *fmt,...) |
デフォルトのエラーファイルにデータを書き込む | |
void | print_message (const char *fmt,...) |
バッファリングなしのメッセージ出力(stderr) | |
void | fprint_message (FILE *fp, const char *fmt,...) |
バッファリングなしのメッセージ出力 | |
void | print_escape (const char *fmt, char *mesg) |
エスケープ文字を含むメッセージの出力(stderr) | |
void | fprint_escape (FILE *fp, char *fmt, char *mesg) |
void | fdump (FILE *fp, unsigned char *mesg, int n) |
16進ダンプを吐き出す | |
void | print_16x (FILE *fp, unsigned char *mesg, int n) |
16進ダンプを吐き出す(1行) | |
Variables | |
int | DebugMode = OFF |
ON の場合 ライブラリ全体がデバックモードであることを示す.デフォルトは OFF.. | |
int | UnitTestMode = OFF |
ユニット単体でのテストを行う場合に使用する.デフォルトは OFF. | |
int | KanjiCode = CODE_UTF8 |
システムの漢字コード | |
int | HostEndian = UNKNOWN_ENDIAN |
システムの Endian | |
unsigned char | LocalIPNum [4] = {0x7f, 0x00, 0x00, 0x01} |
127.0.0.1 のバイナリ | |
unsigned char | LocalIPNum6 [16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01} |
::1 のバイナリ | |
static char | _ToSTR [LDATA] |
作業用(文字変換) | |
FILE * | FP_LogFile = NULL |
FILE * | FP_ErrFile = NULL |
Definition in file tools.c.
char* awk | ( | char * | buf, | |
char | cc, | |||
int | n | |||
) |
char* awk(char* buf, char cc, int n)
ccを区切り記号として, strのバッファ内の n番目の項目を返す. 返されたデータは free()する必要がある.
buf | 操作対象文字列. | |
cc | 区切り文字. | |
n | 項目の指定. 1から数える. |
Definition at line 589 of file tools.c.
Referenced by awk_tList(), decode_mime_rfc2047(), decode_mime_rfc2231(), get_smtp_rcpt(), is_smtp_onecommand(), to_address_num(), to_address_num4(), to_address_num8(), and to_ipaddress_list().
00590 { 00591 int i, j, pos, cnt; 00592 char* item = NULL; 00593 00594 if (buf==NULL) return NULL; 00595 00596 for(i=0,j=0; j<n-1; j++) { 00597 while (buf[i]!='\0' && buf[i]!=cc) i++; 00598 if (buf[i]==cc) i++; 00599 } 00600 if (buf[i]=='\0') return NULL; 00601 00602 pos = i; 00603 while (buf[i]!='\0' && buf[i]!=cc) i++; 00604 cnt = i - pos; 00605 00606 item = (char*)malloc(cnt+1); 00607 if (item==NULL) return NULL; 00608 00609 for (i=0; i<cnt; i++) item[i] = buf[pos+i]; 00610 item[cnt] = '\0'; 00611 00612 return item; 00613 }
int bincmp | ( | unsigned char * | b1, | |
unsigned char * | b2, | |||
int | n | |||
) |
int bincmp(unsigned char* b1, unsigned char* b2, int n)
バイナリデータ s1と s2 nバイト比較する.
b1 | 比較するバイナリデータ1 | |
b2 | 比較するバイナリデータ2 | |
n | 比較するバイト数 |
0 | 一致する | |
1 | 一致しない |
char* cawk | ( | char * | buf, | |
char | cc, | |||
int | n | |||
) |
char* cawk(char* buf, char cc, int n)
ccを区切り記号として, strのバッファ内の n番目の項目を返す.
n は 1から数える.連続する cc(区切り)は一つの区切りとみなす. 返されたデータは free()する必要がある.
buf | 操作対象文字列. | |
cc | 区切り文字. | |
n | 項目の指定. |
Definition at line 632 of file tools.c.
Referenced by cawk_tList().
00633 { 00634 int i, j, pos, cnt; 00635 char* item = NULL; 00636 00637 if (buf==NULL) return NULL; 00638 00639 for(i=0,j=0; j<n-1; j++) { 00640 while (buf[i]!='\0' && buf[i]!=cc) i++; 00641 while (buf[i]!='\0' && buf[i]==cc) i++; 00642 } 00643 if (buf[i]=='\0') return NULL; 00644 00645 pos = i; 00646 while (buf[i]!='\0' && buf[i]!=cc) i++; 00647 cnt = i - pos; 00648 00649 item = (char*)malloc(cnt+1); 00650 if (item==NULL) return NULL; 00651 00652 for (i=0; i<cnt; i++) item[i] = buf[pos+i]; 00653 item[cnt] = '\0'; 00654 00655 return item; 00656 }
char* change_esc | ( | char * | mesg | ) |
char* change_esc(char* mesg)
文字列中の CR, LF を \r, \n に変換する. 返されたデータは free()する必要がある.
mesg | 操作対象の文字列 |
Definition at line 1249 of file tools.c.
References CHAR_CR, and CHAR_LF.
Referenced by fprint_escape(), and print_escape().
01250 { 01251 int i, j; 01252 char* pp; 01253 01254 if (mesg==NULL) return NULL; 01255 01256 pp = (char*)malloc((strlen(mesg)+1)*2); 01257 if (pp==NULL) return NULL; 01258 01259 i = j = 0; 01260 while(mesg[i]!='\0') { 01261 if (mesg[i]==CHAR_CR) { 01262 pp[j++] = '\\'; 01263 pp[j++] = 'r'; 01264 } 01265 else if (mesg[i]==CHAR_LF) { 01266 pp[j++] = '\\'; 01267 pp[j++] = 'n'; 01268 } 01269 else { 01270 pp[j++] = mesg[i]; 01271 } 01272 i++; 01273 } 01274 pp[j] = '\0'; 01275 01276 return pp; 01277 }
void check_endian | ( | void | ) |
void check_endian(void)
大域変数 HostEndian に LITTLE_ENDIAN か BIG_ENDIAN を設定する.
Definition at line 146 of file tools.c.
References HostEndian, is_little_endian(), and UNKNOWN_ENDIAN.
Referenced by double_from_big_endian(), double_from_little_endian(), float_from_big_endian(), float_from_little_endian(), int_from_big_endian(), int_from_little_endian(), short_from_big_endian(), short_from_little_endian(), uint_from_big_endian(), uint_from_little_endian(), ushort_from_big_endian(), and ushort_from_little_endian().
00147 { 00148 if (HostEndian==UNKNOWN_ENDIAN) is_little_endian(); 00149 }
char* chomp | ( | char * | buf | ) |
char* chomp(char* buf)
最初の改行コード以降を無視する.最初の改行コードのある場所に '\0' を代入する.
[in,out] | buf | 改行を無効にする文字列. |
Definition at line 953 of file tools.c.
References CHAR_CR, and CHAR_LF.
Referenced by get_mstream().
00954 { 00955 int i, len; 00956 00957 if (buf==NULL) return NULL; 00958 00959 len = (int)strlen(buf); 00960 for (i=0; i<len; i++) { 00961 if (buf[i]==CHAR_LF || buf[i]==CHAR_CR) { 00962 buf[i] = '\0'; 00963 return buf; 00964 } 00965 } 00966 return buf; 00967 }
void clear_ringBuffer | ( | ringBuffer * | rb | ) |
void clear_ringBuffer(ringBuffer* rb)
リングバッファ rb のデータをクリア(初期化)する.
rb | リングバッファへのポインタ |
Definition at line 3283 of file tools.c.
References ringBuffer::buf, ringBuffer::bufsz, JBXL_NORMAL, and ringBuffer::state.
03284 { 03285 if (rb!=NULL) { 03286 int sz = rb->bufsz; 03287 unsigned char* ptr = rb->buf; 03288 memset(rb->buf, 0, rb->bufsz); 03289 memset(rb, 0, sizeof(ringBuffer)); 03290 rb->buf = ptr; 03291 rb->state = JBXL_NORMAL; 03292 rb->bufsz = sz; 03293 } 03294 }
void close_errfile | ( | void | ) |
void close_errfile(void)
デフォルトのエラーファイルをクローズする
Definition at line 3966 of file tools.c.
03967 { 03968 if (FP_ErrFile==NULL) return; 03969 03970 fclose(FP_ErrFile); 03971 FP_ErrFile = NULL; 03972 03973 return; 03974 }
void close_logfile | ( | void | ) |
void close_logfile(void)
デフォルトのログファイルをクローズする
Definition at line 3888 of file tools.c.
03889 { 03890 if (FP_LogFile==NULL) return; 03891 03892 fclose(FP_LogFile); 03893 FP_LogFile = NULL; 03894 03895 return; 03896 }
int count_lines | ( | const char * | buf | ) |
int count_lines(const char* buf)
文字列データ bufの行数を数える. 行頭が '\0' であっても 1行と数える
buf | 行数を数える文字列データ |
Definition at line 1680 of file tools.c.
References CHAR_CR, CHAR_LF, and line().
01681 { 01682 int i = 0; 01683 int line = 0; 01684 01685 if (buf==NULL) return 0; 01686 line++; 01687 01688 while(buf[i]!='\0') { 01689 if (buf[i]==CHAR_CR) { 01690 line++; 01691 if (buf[i+1]==CHAR_LF) i++; 01692 } 01693 else if (buf[i]==CHAR_LF) { 01694 line++; 01695 } 01696 i++; 01697 } 01698 01699 return line; 01700 }
char* cut_file_extension | ( | const char * | str | ) |
char* cut_file_extension(const char* str)
拡張子を削除したパス名を生成する.strは変化しない.要 free.
str | ファイルのフルパス |
Definition at line 2278 of file tools.c.
02279 { 02280 if (str==NULL) return NULL; 02281 02282 char cc = '.'; 02283 int len = (int)strlen(str); 02284 char* path = (char*)malloc(len+1); 02285 memcpy(path, str, len+1); 02286 02287 int sz = len - 1; 02288 while (sz>=0 && path[sz]!=cc) sz--; 02289 02290 if (sz<1) return path; 02291 path[sz] = '\0'; 02292 02293 return path; 02294 }
char* cut_str | ( | char * | buf, | |
int | ls, | |||
int | le | |||
) |
char* cut_str(char* buf, int ls, int le)
buf[ls] 〜 buf[le] を切り出してメモリに格納して返す. 返されたデータは free()する必要がある.
buf | 操作対象の文字列 | |
ls | 切り出し開始の位置 | |
le | 切り出し終了の位置 |
Definition at line 1352 of file tools.c.
Referenced by check_passwd(), command_USERID(), and x2crypt().
01353 { 01354 int i, len; 01355 char* ret; 01356 01357 if (buf==NULL) return NULL; 01358 01359 ls = Max(ls, 0); 01360 le = Min(le, (int)strlen((const char*)buf)); 01361 len = le - ls + 1; 01362 if (len<=0) return NULL; 01363 01364 ret = (char*)malloc(len+1); 01365 if (ret==NULL) return NULL; 01366 memset(ret, 0, len+1); 01367 01368 for (i=0; i<len; i++) ret[i] = buf[i+ls]; 01369 01370 return ret; 01371 }
unsigned char* decode_base64 | ( | unsigned char * | buf, | |
int * | sz | |||
) |
unsigned char* decode_base64(unsigned char* buf, int* sz)
bufを base64からデコードする.
変換は bufの先頭から順次行われる.A-Za-z0-9+/ 以外は無視する(例えば改行コード).
入力バッファ部が 4byte(6bit*4)の場合, 出力バッファ部は 3byte(8bit*3)となる. 入力バッファ部のバイト数が 4の倍数でない場合(不正なデータ), 足りない入力バッファ部には '='が挿入されているものとみなす.
返されたデータは free()する必要がある.
buf | base64からデコードする文字列. | |
[in,out] | sz | in: sz デコードされたデータの長さを格納する intへのポインタ.NULLでも良い. out: デコードされたデータのサイズ. |
"QQ" をデコードすると 'A',0x00 となる.
Definition at line 2746 of file tools.c.
References setBit.
Referenced by decode_base64_Buffer(), decode_base64_filename(), and decode_mime_rfc2047().
02747 { 02748 int i, j, cc=0, bas, lt, ln; 02749 unsigned char* dcd; 02750 02751 lt = 0; 02752 ln = (int)strlen((const char*)buf); 02753 while (buf[lt]!='=' && lt<ln) { 02754 lt++; 02755 if (lt==ln) break; 02756 } 02757 02758 //len = lt/4*3 + (lt%4)*3/4; 02759 int len = ((lt+1)*3)/4; 02760 if (sz!=NULL) *sz = len; 02761 02762 dcd = (unsigned char*)malloc(len); 02763 if (dcd==NULL) return NULL; 02764 memset(dcd, 0, len); 02765 02766 for (i=0; i<lt; i++) { 02767 if (buf[i]>='A' && buf[i]<='Z') cc = buf[i] - 'A'; 02768 else if (buf[i]>='a' && buf[i]<='z') cc = buf[i] - 'a' + 26; 02769 else if (buf[i]>='0' && buf[i]<='9') cc = buf[i] - '0' + 52; 02770 else if (buf[i]=='+') cc = 62; 02771 else if (buf[i]=='/') cc = 63; 02772 02773 if (cc<64) { 02774 bas = 32; 02775 for (j=0; j<6; j++) { 02776 setBit(dcd, i*6+j, cc/bas); 02777 cc = cc%bas; 02778 bas = bas/2; 02779 } 02780 } 02781 } 02782 02783 return dcd; 02784 }
unsigned char* decode_base64_filename | ( | unsigned char * | buf, | |
int * | sz | |||
) |
unsigned char* decode_base64_filename(unsigned char* buf, int* sz)
bufを Base64で decodeしてバイナリデータを取り出す.ただし '$' は '/' として扱う.
Definition at line 2851 of file tools.c.
References decode_base64().
02852 { 02853 int i, len = (int)strlen((char*)buf); 02854 for (i=0; i<len; i++) { 02855 if (buf[i]=='$') buf[i] = '/'; 02856 } 02857 02858 unsigned char* dec = decode_base64(buf, sz); 02859 02860 return dec; 02861 }
unsigned char decode_hex | ( | unsigned char | pp1, | |
unsigned char | pp2 | |||
) |
unsigned char decode_hex(unsigned char pp1, unsigned char pp2)
16進コードをキャラクタに変換する.O-9,A-F以外が指定された場合は0とみなす.
pp1 | 16進コードの上位4Bit. 0-9,A-F | |
pp2 | 16進コードの下位4Bit. 0-9,A-F |
例:decode_hex('2', '0') は ' ' を返す.
Definition at line 3136 of file tools.c.
Referenced by decode_quoted_printable(), and decode_urlenc().
03137 { 03138 unsigned char ret; 03139 03140 if (pp1>=0x30 && pp1<=0x39) pp1 -= 0x30; // 0-9 03141 else if (pp1>=0x41 && pp1<=0x46) pp1 -= 0x37; // A-F 03142 else if (pp1>=0x61 && pp1<=0x66) pp1 -= 0x57; // a-f 03143 else pp1 = 0x00; 03144 03145 if (pp2>=0x30 && pp2<=0x39) pp2 -= 0x30; // 0-9 03146 else if (pp2>=0x41 && pp2<=0x46) pp2 -= 0x37; // A-F 03147 else if (pp2>=0x41 && pp2<=0x46) pp2 -= 0x57; // a-f 03148 else pp1 = 0x00; 03149 03150 ret = (pp1<<4) + pp2; 03151 return ret; 03152 }
unsigned char* decode_quoted_printable | ( | unsigned char * | buf, | |
int * | sz | |||
) |
unsigned char* decode_quoted_printable(unsigned char* buf, int* sz)
buf を quoted printableからデコードする. 返されたデータは free()する必要がある.
buf | デコードする文字列. | |
[out] | sz | デコードされたデータの長さを格納する変数. |
Definition at line 2991 of file tools.c.
References decode_hex().
Referenced by decode_mime_rfc2047().
02992 { 02993 int i, j, len; 02994 unsigned char* dec; 02995 02996 len = (int)strlen((const char*)buf) + 1; 02997 dec = (unsigned char*)malloc(len); 02998 if (dec==NULL) return NULL; 02999 memset(dec, 0, len); 03000 03001 i = j = 0; 03002 while (buf[i]!='\0') { 03003 if (buf[i]=='=') { 03004 if (buf[i+1]=='\0') return dec; 03005 if (buf[i+2]=='\0') return dec; 03006 dec[j++] = decode_hex(buf[i+1], buf[i+2]); 03007 i += 2; 03008 } 03009 else { 03010 if (buf[i]=='_') dec[j++] = ' '; // RFC2047 03011 else dec[j++] = buf[i]; 03012 } 03013 i++; 03014 } 03015 03016 *sz = j; 03017 return dec; 03018 }
unsigned char* decode_urlenc | ( | unsigned char * | buf, | |
int * | sz | |||
) |
unsigned char* decode_urlenc(unsigned char* buf, int* sz)
buf を URLエンコードからデコードする. 返されたデータは free()する必要がある.
buf | デコードする文字列. | |
[out] | sz | デコードされたデータの長さを格納する変数. |
Definition at line 2893 of file tools.c.
References decode_hex().
Referenced by decode_mime_rfc2231().
02894 { 02895 int i, j, len; 02896 unsigned char* dec; 02897 02898 if (buf==NULL) return NULL; 02899 02900 len = (int)strlen((const char*)buf) + 1; 02901 dec = (unsigned char*)malloc(len); 02902 if (dec==NULL) return NULL; 02903 memset(dec, 0, len); 02904 02905 i = j = 0; 02906 while (buf[i]!='\0') { 02907 if (buf[i]=='%') { 02908 if (buf[i+1]=='\0') return dec; 02909 if (buf[i+2]=='\0') return dec; 02910 dec[j++] = decode_hex(buf[i+1], buf[i+2]); 02911 i += 2; 02912 } 02913 else { 02914 if (buf[i]=='+') dec[j++] = ' '; 02915 else dec[j++] = buf[i]; 02916 } 02917 i++; 02918 } 02919 02920 *sz = j; 02921 return dec; 02922 }
char* del_file_extension | ( | const char * | str | ) |
char* del_file_extension(const char* str)
フルパスから拡張子を削除する. strの中身を書き換えて,strを返す.free() してはいけない.
str | ファイルのフルパス |
char* del_file_name | ( | const char * | str | ) |
char* del_file_name(const char* str)
フルパスからファイル名を削除する. strの中身を書き換えて,strを返す.free() してはいけない.
str | ファイルのフルパス |
Definition at line 2079 of file tools.c.
02080 { 02081 if (str==NULL) return NULL; 02082 02083 #ifdef WIN32 02084 char cc = '\\'; 02085 #else 02086 char cc = '/'; 02087 #endif 02088 02089 char* path = (char*)str; 02090 int len = (int)strlen(str); 02091 if (len==1) { 02092 if (path[0]==cc) return path; 02093 else return NULL; 02094 } 02095 02096 int sz = len - 1; 02097 while (sz>=0 && str[sz]!=cc) sz--; 02098 02099 if (sz<0) { 02100 path[0] = '.'; 02101 path[1] = cc; 02102 path[2] = '\0'; 02103 } 02104 else { 02105 path[sz+1] = '\0'; 02106 } 02107 02108 return path; 02109 }
void del_ringBuffer | ( | ringBuffer ** | rb | ) |
void del_ringBuffer(ringBuffer** rb)
new_ringBuffer()で作り出したリングバッファを削除する.
[in,out] | rb | in: 削除するリングバッファポインタへのポインタ. out: *rb はNULLになる. |
Definition at line 3199 of file tools.c.
References freeNull.
03200 { 03201 if (rb!=NULL && *rb!=NULL) { 03202 freeNull((*rb)->buf); 03203 free(*rb); 03204 *rb = NULL; 03205 } 03206 }
char* double_bs | ( | char * | str | ) |
char* double_bs(char* str)
文字列中の バックスペース \を 2重 \\ に変えた文字列を返す. 返されたデータは free()する必要がある.
str | 操作対象の文字列 |
Definition at line 2517 of file tools.c.
02518 { 02519 int i, j; 02520 int len, bsn=0; 02521 char* buf; 02522 02523 len = (int)strlen(str); 02524 for (i=0; i<len; i++) if (str[i]=='\\') bsn++; 02525 buf = (char*)malloc(len+bsn+1); 02526 if (buf==NULL) return NULL; 02527 02528 for (i=0,j=0; i<len; i++) { 02529 buf[j++] = str[i]; 02530 if (str[i]=='\\') buf[j++] = '\\'; 02531 } 02532 buf[j] = '\0'; 02533 02534 return buf; 02535 }
double double_from_big_endian | ( | void * | ptr | ) |
double double_from_big_endian(void* ptr)
Big Endian形式で格納されている double型の値を取り出す.
ptr | 変数が格納されているメモリへのポインタ |
Definition at line 274 of file tools.c.
References check_endian(), HostEndian, LITTLE_ENDIAN, reverse_str(), and UNKNOWN_ENDIAN.
00275 { 00276 double ret = *((double*)ptr); 00277 00278 if (HostEndian==UNKNOWN_ENDIAN) check_endian(); 00279 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 8); 00280 return ret; 00281 }
double double_from_little_endian | ( | void * | ptr | ) |
double double_from_little_endian(void* ptr)
Little Endian形式で格納されている double型の値を取り出す.
ptr | 変数が格納されているメモリへのポインタ |
Definition at line 160 of file tools.c.
References BIG_ENDIAN, check_endian(), HostEndian, reverse_str(), and UNKNOWN_ENDIAN.
Referenced by draw_shape_polygon(), and read_shape_main_file().
00161 { 00162 double ret = *((double*)ptr); 00163 00164 if (HostEndian==UNKNOWN_ENDIAN) check_endian(); 00165 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 8); 00166 return ret; 00167 }
char* dtostr | ( | double | n | ) |
char* dtostr_ts | ( | double | n | ) |
char* dtostr_ts(double n)
double型 nを文字列にして返す. Thread Safe
n | 文字列に変換する値 |
Definition at line 1658 of file tools.c.
References LDATA.
Referenced by llsd_bin_main_parse(), and make_xml_attr_bydouble().
01659 { 01660 char* str = NULL; 01661 str = (char*)malloc(LDATA); 01662 if (str==NULL) return NULL; 01663 01664 memset(str, 0, LDATA); 01665 snprintf(str, LDATA-1, "%f", n); 01666 return str; 01667 }
char* dup_str | ( | char * | buf | ) |
char* dup_str(char* buf)
文字列 bufの複製を作り出す.返されたデータは free()する必要がある.
buf | コピー元の文字列 |
Definition at line 1383 of file tools.c.
Referenced by get_string_from_json().
01384 { 01385 int len; 01386 char* ret; 01387 01388 if (buf==NULL) return NULL; 01389 01390 len = (int)strlen(buf); 01391 ret = (char*)malloc(len+1); 01392 if (ret==NULL) return NULL; 01393 01394 memcpy(ret, buf, len); 01395 ret[len] = '\0'; 01396 01397 return ret; 01398 }
unsigned char* encode_base64 | ( | unsigned char * | buf, | |
int | sz | |||
) |
unsigned char* encode_base64(unsigned char* buf, int sz)
バイナリデータ bufを base64にエンコードする.
入力バッファ部が 3byte(8bit*3)の場合, 出力バッファ部は 4byte(6bit*4)となる. 入力バッファ部が 6bit境界でない場合, 6bit境界 まで 0が付加されたと見される.
出力バッファ部が 4byte境界でない場合, 4byte境界まで '='を付加して出力する. また,出力バッファ部での 60byte毎の改行は行わない.
一般に n byte 入力された場合, base64の出力の文字数は (n+2)/3*4 byte となる.
返されたデータは free()する必要がある.
buf | base64にエンコードするデータ. | |
sz | データの長さを示す.-1以下の場合は buf は文字列とみなす. |
'A',0x00,0x01 を文字列(sz=1)とみなして符号化すると "QQ==" となる.
'A',0x00,0x01 の 3byteを符号化(sz=3)すると "QQAB" となる.
Definition at line 2811 of file tools.c.
References getBit, and setBit.
Referenced by encode_base64_Buffer(), encode_base64_filename(), encode_mime_string(), and temp_filename().
02812 { 02813 unsigned char base[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 02814 unsigned char bas; 02815 int i, j, len; 02816 unsigned char* ecd; 02817 02818 if (buf==NULL) return NULL; 02819 if (sz<0) len = (int)strlen((const char*)buf); 02820 else len = sz; 02821 if (len<=0) return NULL; 02822 02823 sz = ((len+2)/3)*4; 02824 ecd = (unsigned char*)malloc(sz+1); 02825 if (ecd==NULL) return NULL; 02826 memset(ecd, 0, sz+1); 02827 02828 for (i=0; i<sz; i++) { 02829 bas = 0x00; 02830 if (len*8 > i*6) { 02831 for (j=0; j<6; j++) { 02832 if (len*8 > i*6+j) setBit(&bas, j+2, getBit(buf, i*6+j)); 02833 //else setBit(&bas, j+2, 0); 02834 } 02835 ecd[i] = base[(int)bas]; 02836 } 02837 else { 02838 ecd[i] = '='; 02839 } 02840 } 02841 02842 return ecd; 02843 }
unsigned char* encode_base64_filename | ( | unsigned char * | buf, | |
int | sz | |||
) |
unsigned char* encode_base64_filename(unsigned char* buf, int sz)
バイナリデータ bufを Base64で encodeしてファイル名を作る.ただし '/' は '$' として扱う.
Definition at line 2869 of file tools.c.
References encode_base64().
02870 { 02871 unsigned char* enc = encode_base64(buf, sz); 02872 02873 int i, len = (int)strlen((char*)enc); 02874 for (i=0; i<len; i++) { 02875 if (enc[i]=='/') enc[i] = '$'; 02876 } 02877 02878 return enc; 02879 }
unsigned char* encode_hex | ( | unsigned char | cc | ) |
unsigned char* encode_hex(unsigned char cc)
キャラクタを16進コードの文字列に変換する. 返されたデータは free()する必要がある.
cc | 変換するキャラクタ. |
NULL | メモリ不足. |
encode_hex(' ') は "20" を返す.
Definition at line 3102 of file tools.c.
Referenced by encode_quoted_printable(), and encode_urlenc().
03103 { 03104 unsigned char* ret; 03105 unsigned char pp1, pp2; 03106 unsigned char base[] = "0123456789ABCDEF"; 03107 03108 ret = (unsigned char*)malloc(3); 03109 if (ret==NULL) return NULL; 03110 03111 pp1 = cc >> 4; 03112 pp2 = cc & 0x0f; 03113 03114 ret[0] = base[pp1]; 03115 ret[1] = base[pp2]; 03116 ret[2] = '\0'; 03117 03118 return ret; 03119 }
unsigned char* encode_quoted_printable | ( | unsigned char * | buf, | |
int | sz | |||
) |
unsigned char* encode_quoted_printable(unsigned char* buf, int sz)
バイナリデータ bufを quoted printable にエンコードする.
RFC2047 に従い,' ' は '_' にエンコードする.
エンコードしない文字 '=', '_' 以外の 0x21-0x7e
エンコードする文字 '=', '_', 0x00-0x20, 0x7f-0xff
返されたデータは free()する必要がある.
buf | エンコードするデータ. | |
sz | エンコードするデータの長さ.-1以下の場合は buf は文字列とみなす. |
Definition at line 3037 of file tools.c.
References encode_hex().
Referenced by encode_mime_string().
03038 { 03039 int i, j, len; 03040 unsigned char* enc; 03041 03042 if (sz<0) sz = (int)strlen((const char*)buf); 03043 len = sz*3 + 1; 03044 enc = (unsigned char*)malloc(len); 03045 if (enc==NULL) return NULL; 03046 memset(enc, 0, len); 03047 03048 for (i=0, j=0; i<sz; i++) { 03049 if (buf[i]=='=') { // 0x3d 03050 enc[j++] = '='; 03051 enc[j++] = '3'; 03052 enc[j++] = 'D'; 03053 } 03054 else if (buf[i]=='_') { // 0x5f 03055 enc[j++] = '='; 03056 enc[j++] = '5'; 03057 enc[j++] = 'F'; 03058 } 03059 else if (buf[i]==' ') { // 0x20 RFC2047 03060 enc[j++] = '_'; 03061 } 03062 else if (buf[i]<=0x1f || buf[i]>=0x7f) { 03063 unsigned char* asc = encode_hex(buf[i]); 03064 if (asc==NULL) { 03065 free(enc); 03066 return NULL; 03067 } 03068 enc[j++] = '='; 03069 enc[j++] = asc[0]; 03070 enc[j++] = asc[1]; 03071 free(asc); 03072 } 03073 else { 03074 enc[j++] = buf[i]; 03075 } 03076 } 03077 03078 return enc; 03079 }
unsigned char* encode_urlenc | ( | unsigned char * | buf, | |
int | sz | |||
) |
unsigned char* encode_urlenc(unsigned char* buf, int sz)
バイナリデータ bufを URLエンコードする.
エンコードしない文字については色々な考え方があるが,最大公約数的に考えてこのプログラムでは以下のようにする.
エンコードしない文字 0-9, A-Z, a-z, -._
返されたデータは free()する必要がある.
buf | エンコードするデータ. | |
sz | エンコードするデータの長さ.-1以下の場合は buf は文字列とみなす. |
Definition at line 2940 of file tools.c.
References encode_hex().
Referenced by add_form_urlenc(), encode_mime_string(), and make_form_urlenc().
02941 { 02942 int i, j, len; 02943 unsigned char* enc; 02944 02945 if (buf==NULL) return NULL; 02946 02947 if (sz<0) sz = (int)strlen((const char*)buf); 02948 len = sz*3 + 1; 02949 enc = (unsigned char*)malloc(len); 02950 if (enc==NULL) return NULL; 02951 memset(enc, 0, len); 02952 02953 for(i=0, j=0; i<sz; i++) { 02954 if (buf[i]==' ') { // 半角スペース 02955 enc[j++] = '+'; 02956 } 02957 else if ((buf[i]>=0x30 && buf[i]<=0x39) || // 0-9 02958 (buf[i]>=0x41 && buf[i]<=0x5a) || // A-Z 02959 (buf[i]>=0x61 && buf[i]<=0x7a) || // a-z 02960 buf[i]=='-' || buf[i]=='.' || buf[i]=='_'){ // - . _ 02961 enc[j++] = buf[i]; 02962 } 02963 else { 02964 unsigned char* asc = encode_hex(buf[i]); 02965 if (asc==NULL) { 02966 free(enc); 02967 return NULL; 02968 } 02969 enc[j++] = '%'; 02970 enc[j++] = asc[0]; 02971 enc[j++] = asc[1]; 02972 free(asc); 02973 } 02974 } 02975 02976 return enc; 02977 }
void euc2sjis | ( | unsigned char * | c1, | |
unsigned char * | c2 | |||
) |
void euc2sjis(unsigned char *c1, unsigned char *c2)
漢字コード変換.EUC → SJIS
[in,out] | c1 | 変換する文字の第一バイト.内容が書き換えられる. |
[in,out] | c2 | 変換する文字の第二バイト.内容が書き換えられる. |
Definition at line 2644 of file tools.c.
Referenced by kanji_convert_Buffer(), and kanji_convert_euc2sjis().
02645 { 02646 if (*c1%2==0) *c2 -= 0x02; 02647 else{ 02648 *c2 -= 0x61; 02649 if (*c2>0x7e) (*c2)++; 02650 } 02651 02652 if (*c1<0xdf) { 02653 (*c1)++; 02654 *c1 /= 2; 02655 *c1 += 0x30; 02656 } 02657 else { 02658 (*c1)++; 02659 *c1 /= 2; 02660 *c1 += 0x70; 02661 } 02662 }
int ex_strncasecmp | ( | const char * | dat, | |
const char * | key, | |||
int | len | |||
) |
int ex_strncasecmp(const char* dat, const char* key, int len)
拡張文字比較.ケース無視.
dat | 比べる文字列1. | |
key | 比べる文字列2. | |
len | 1以上 一致させる長さ. | |
len | 0 完全一致. | |
len | -1 dat の長さに合わせる. | |
len | -2 key の長さに合わせる. |
TRUE | 一致した | |
FALSE | 一致しなかった |
Definition at line 849 of file tools.c.
Referenced by del_tList_key(), next_strncasecmp_horizon_tTree(), next_strncasecmp_vertical_tTree(), strncasecmp_back_tList(), strncasecmp_tList(), and strncasecmp_tTree().
00850 { 00851 if (dat==NULL || key==NULL) return FALSE; 00852 00853 if (len==0) { 00854 if (!strcasecmp(dat, key)) return TRUE; 00855 } 00856 else if (len>0) { 00857 if (!strncasecmp(dat, key, len)) return TRUE; 00858 } 00859 else if (len<0) { 00860 int sz; 00861 if (len==-1) sz = (int)strlen(dat); 00862 else sz = (int)strlen(key); 00863 if (!strncasecmp(dat, key, sz)) return TRUE; 00864 } 00865 00866 return FALSE; 00867 }
int ex_strncaservscmp | ( | const char * | dat, | |
const char * | key, | |||
int | len | |||
) |
int ex_strncaervscmp(const char* dat, const char* key, int len)
拡張文字比較.後ろから比べる.ケース無視.
dat | 比べる文字列1. | |
key | 比べる文字列2. | |
len | 1以上 一致させる長さ. | |
len | 0 完全一致. | |
len | -1 dat の長さに合わせる. | |
len | -2 key の長さに合わせる. |
TRUE | 一致した | |
FALSE | 一致しなかった |
Definition at line 923 of file tools.c.
References FALSE, strncaservscmp(), and TRUE.
Referenced by strncaservscmp_back_tList(), and strncaservscmp_tList().
00924 { 00925 if (dat==NULL || key==NULL) return FALSE; 00926 00927 if (len==0) { 00928 if (!strcasecmp(dat, key)) return TRUE; 00929 } 00930 else if (len>0) { 00931 if (!strncaservscmp(dat, key, len)) return TRUE; 00932 } 00933 else if (len<0) { 00934 int sz; 00935 if (len==-1) sz = (int)strlen(dat); 00936 else sz = (int)strlen(key); 00937 if (!strncaservscmp(dat, key, sz)) return TRUE; 00938 } 00939 00940 return FALSE; 00941 }
int ex_strncmp | ( | const char * | dat, | |
const char * | key, | |||
int | len | |||
) |
int ex_strncmp(const char* dat, const char* key, int len)
拡張文字比較
dat | 比べる文字列1. | |
key | 比べる文字列2. | |
len | 1以上 一致させる長さ. | |
len | 0 完全一致. | |
len | -1 dat の長さに合わせる. | |
len | -2 key の長さに合わせる. |
TRUE | 一致した | |
FALSE | 一致しなかった |
Definition at line 812 of file tools.c.
Referenced by next_strncmp_horizon_tTree(), next_strncmp_vertical_tTree(), replace_all_tTree_node(), strncmp_back_tList(), strncmp_tList(), and strncmp_tTree().
00813 { 00814 if (dat==NULL || key==NULL) return FALSE; 00815 00816 if (len==0) { 00817 if (!strcmp(dat, key)) return TRUE; 00818 } 00819 else if (len>0) { 00820 if (!strncmp(dat, key, len)) return TRUE; 00821 } 00822 else if (len<0) { 00823 int sz; 00824 if (len==-1) sz = (int)strlen(dat); 00825 else sz = (int)strlen(key); 00826 if (!strncmp(dat, key, sz)) return TRUE; 00827 } 00828 00829 return FALSE; 00830 }
int ex_strnrvscmp | ( | const char * | dat, | |
const char * | key, | |||
int | len | |||
) |
int ex_strnrvscmp(const char* dat, const char* key, int len)
拡張文字比較.後ろから比べる.
dat | 比べる文字列1. | |
key | 比べる文字列2. | |
len | 1以上 一致させる長さ. | |
len | 0 完全一致. | |
len | -1 dat の長さに合わせる. | |
len | -2 key の長さに合わせる. |
TRUE | 一致した | |
FALSE | 一致しなかった |
Definition at line 886 of file tools.c.
References FALSE, strnrvscmp(), and TRUE.
Referenced by strnrvscmp_back_tList(), and strnrvscmp_tList().
00887 { 00888 if (dat==NULL || key==NULL) return FALSE; 00889 00890 if (len==0) { 00891 if (!strcmp(dat, key)) return TRUE; 00892 } 00893 else if (len>0) { 00894 if (!strnrvscmp(dat, key, len)) return TRUE; 00895 } 00896 else if (len<0) { 00897 int sz; 00898 if (len==-1) sz = (int)strlen(dat); 00899 else sz = (int)strlen(key); 00900 if (!strnrvscmp(dat, key, sz)) return TRUE; 00901 } 00902 00903 return FALSE; 00904 }
void fdump | ( | FILE * | fp, | |
unsigned char * | mesg, | |||
int | n | |||
) |
void fdump(FILE* fp, unsigned char* mesg, int n)
デバッグ用 16進ダンプ出力.
mesgの nバイトを16進表示する.n<0 の場合は 文字列とみなす.
fp | 出力するファイルへのポインタ.NULLの場合は stderr | |
mesg | 表示するデータ. | |
n | 表示するバイト数 |
Definition at line 4157 of file tools.c.
Referenced by dump_http_header(), and dump_tList().
04158 { 04159 int i, j, mod, len; 04160 char ascii[16]; 04161 04162 if (fp==NULL) fp = stderr; 04163 04164 if (mesg==NULL) { 04165 fprintf(fp, "(Dump Data is NULL)\n"); 04166 return; 04167 } 04168 04169 if (n<0) len = (int)strlen((const char*)mesg); 04170 else len = n; 04171 04172 memset(ascii, 0x2e, 16); 04173 for (i=0, j=0; i<len; i++) { 04174 fprintf(fp, "%02x ", mesg[i]); 04175 if (mesg[i]>=0x20 && mesg[i]<=0x7e) ascii[j] = mesg[i]; 04176 j++; 04177 if (j==16) { 04178 fprintf(fp, " "); 04179 for (j=0; j<16; j++) { 04180 fprintf(fp, "%c ", ascii[j]); 04181 } 04182 fprintf(fp, "\n"); 04183 memset(ascii, 0x2e, 16); 04184 j = 0; 04185 } 04186 } 04187 04188 mod = len%16; 04189 if (mod>0) { 04190 for (i=0; i<17-mod; i++) fprintf(fp, " "); 04191 for (i=0; i<mod; i++) fprintf(fp, "%c ", ascii[i]); 04192 } 04193 fprintf(fp, "\n"); 04194 }
unsigned char* fgets_mstream | ( | unsigned char * | mesg, | |
mstream * | sb | |||
) |
unsigned char* fgets_mstream(unsigned char* mesg, mstream* sb)
メッセージストリームからメッセージを一行だけ取り出す.
メッセージ mesg はメッセージストリームに一旦バッファリングされ,この関数により一行ずつ読み出される.
結果が返される時,行中の改行コードは削除され,行末には必ず \0 が入る.
メッセージストリームのバッファ部が確保されていない場合は,最初に呼び出された時点で確保される.
一旦この関数を使用して,受信データをバッファリングしたら,最後まで読み取りには必ず同じストリームを使用して
この関数を呼び出さばければならない.そうで無い場合は受信データの整合性は保証されない.
mesg | バッファに一旦格納されるメッセージ.NULLでも可. | |
[in] | sb | ストリームバッファ(リングバッファ型のストリームバッファ). |
[out] | sb | sb->buf バッファ部が確保さえていなければ,自動的に確保される. |
[out] | sb | sb->state JBXL_ERROR: メッセージストリーム操作中は異常な状態にある. |
[out] | sb | sb->state JBXL_NODATA: メッセージストリーム中に有効なデータがない.return は NULL |
Definition at line 3569 of file tools.c.
References get_mstream(), JBXL_NODATA, JBXL_NORMAL, make_mstream, put_mstream(), and RECVBUFSZ.
Referenced by fgets_mstream_Buffer().
03570 { 03571 int state = JBXL_NORMAL; 03572 unsigned char* pp; 03573 03574 if (sb==NULL) return NULL; 03575 if (sb->buf==NULL) { 03576 *sb = make_mstream(RECVBUFSZ); 03577 if (sb->buf==NULL) return NULL; 03578 } 03579 03580 if (mesg!=NULL) put_mstream(sb, mesg); 03581 if (sb->state<0) state = sb->state; 03582 03583 if (sb->datano==0) { 03584 sb->state = JBXL_NODATA; 03585 return NULL; 03586 } 03587 pp = get_mstream(sb); 03588 03589 if (sb->state>=0 && state<0) sb->state = state; 03590 return pp; 03591 }
FILE* file_chmod_open | ( | const char * | fn, | |
const char * | fm, | |||
mode_t | mode | |||
) |
FILE* file_chmod_open(const char* fn, const char* fm, mode_t mode)
指定したファイルが存在して読み込み可能であれば,属性をmode へ変更した後,ファイルを fmモードでオープンしなおして,ファイルポインタを返す.
存在しなければ,ファイルを作成して属性を変更し,その後,ファイルを fmモードでオープンしなおして, ファイルポインタを返す.
属性の指定方法については man 2 chmod を参照すること.
fn | ファイル名 | |
fm | ファイルモード,"r","w","a"..... | |
mode | 属性.see... man 2 chmod |
NULL以外 | オープンしたファイルポインタ | |
NULL | 失敗. |
Definition at line 2364 of file tools.c.
References file_exist().
Referenced by check_server_spki(), and get_DHspki_ff().
02365 { 02366 FILE* fp; 02367 02368 if (!file_exist(fn)) { 02369 if ((fp=fopen(fn,"wb"))==NULL) return NULL; 02370 fclose(fp); 02371 } 02372 02373 #ifndef WIN32 02374 fp = NULL; 02375 if (chmod(fn, mode)) return fp; 02376 #endif 02377 02378 fp = fopen(fn, fm); 02379 return fp; 02380 }
int file_exist | ( | const char * | fn | ) |
int file_exist(const char* fn)
指定したファイルが存在して読み込み可能であれば「真」をそうでなければ「偽」を返す.
ファイルを一度オープンして確認するので,時間が掛かる. 読み込み可能なファイルを確認するのであれば,file_size()の方が(たぶん)早い.
fn | ファイル名 |
TRUE | ファイルが存在し,読みこみ可能. | |
FALSE | ファイルが存在しないか,または読みこみ不可能. |
Definition at line 2334 of file tools.c.
Referenced by file_chmod_open(), get_DHspki_ff(), sql_open(), and temp_filename().
02335 { 02336 FILE* fp; 02337 02338 if (fn==NULL) return FALSE; 02339 02340 if ((fp=fopen(fn,"rb"))==NULL) { 02341 return FALSE; 02342 } 02343 fclose(fp); 02344 return TRUE; 02345 }
int file_from_to | ( | const char * | src, | |
const char * | dst, | |||
const char * | mode | |||
) |
int file_from_to(const char* src, const char* dst, const char* mode)
modeに従って,ファイル srcを dstにコピーする.
src | コピー元(ソース)ファイル名 | |
dst | コピー先(ディスティネーション)ファイル名 | |
mode | コピー先ファイルのオープンモード.fopenに同じ."rwa" |
0以上 | コピーしたサイズ | |
JBXL_MALLOC_ERROR | 作業用メモリが足りない. | |
JBXL_FILE_EXIST_ERROR | ソースファイルが存在しない.(シンボリックリンクも×) | |
JBXL_FILE_OPEN_ERROR | ソースファイルのオープン失敗 | |
JBXL_FILE_DESTOPEN_ERROR | ディスティネーションファイルのオープン失敗 |
Definition at line 1969 of file tools.c.
References file_size(), JBXL_FILE_DESTOPEN_ERROR, JBXL_FILE_EXIST_ERROR, JBXL_FILE_OPEN_ERROR, JBXL_MALLOC_ERROR, and UNUSED.
01970 { 01971 long int sz; 01972 unsigned char* buf; 01973 FILE* fp; 01974 size_t rs; 01975 UNUSED(rs); 01976 01977 sz = file_size(src); 01978 if (sz<0) return JBXL_FILE_EXIST_ERROR; 01979 buf = (unsigned char*)malloc(sz); 01980 if (buf==NULL) return JBXL_MALLOC_ERROR; 01981 01982 fp = fopen(src, "rb"); 01983 if (fp==NULL) { 01984 free(buf); 01985 return JBXL_FILE_OPEN_ERROR; 01986 } 01987 rs = fread(buf, sz, 1, fp); 01988 fclose(fp); 01989 01990 fp = fopen(dst, mode); 01991 if (fp==NULL) { 01992 free(buf); 01993 return JBXL_FILE_DESTOPEN_ERROR; 01994 } 01995 fwrite(buf, sz, 1, fp); 01996 fclose(fp); 01997 01998 free(buf); 01999 return sz; 02000 }
unsigned long int file_size | ( | const char * | fn | ) |
unsigned long int file_size(const char* fn)
通常のファイルの大きさを返す.シンボリックリンクなどは 0.
fn | ファイル名 |
Definition at line 2306 of file tools.c.
Referenced by file_from_to(), read_Buffer_file(), read_cmn_file(), read_dicom_file(), read_file(), read_jp2k_file(), read_xxx_file(), send_http_file(), send_http_res_file(), and send_https_file().
02307 { 02308 struct stat stbuf; 02309 02310 stat(fn, &stbuf); 02311 02312 #ifdef WIN32 02313 return stbuf.st_size; 02314 #else 02315 if (S_ISREG(stbuf.st_mode)) return stbuf.st_size; 02316 else return 0; 02317 #endif 02318 }
float float_from_big_endian | ( | void * | ptr | ) |
float float_from_big_endian(void* ptr)
Big Endian形式で格納されている float型の値を取り出す.
ptr | 変数が格納されているメモリへのポインタ |
Definition at line 293 of file tools.c.
References check_endian(), HostEndian, LITTLE_ENDIAN, reverse_str(), and UNKNOWN_ENDIAN.
00294 { 00295 float ret = *((float*)ptr); 00296 00297 if (HostEndian==UNKNOWN_ENDIAN) check_endian(); 00298 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 4); 00299 return ret; 00300 }
float float_from_little_endian | ( | void * | ptr | ) |
float float_from_little_endian(void* ptr)
Little Endian形式で格納されている float型の値を取り出す.
ptr | 変数が格納されているメモリへのポインタ |
Definition at line 179 of file tools.c.
References BIG_ENDIAN, check_endian(), HostEndian, reverse_str(), and UNKNOWN_ENDIAN.
00180 { 00181 float ret = *((float*)ptr); 00182 00183 if (HostEndian==UNKNOWN_ENDIAN) check_endian(); 00184 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 4); 00185 return ret; 00186 }
int fp_from_to | ( | FILE * | src, | |
FILE * | dst, | |||
long int | sz | |||
) |
int fp_from_to(FILE* src, FILE* dst, long int sz)
ファイル srcを dstにコピーする.
src | コピー元(ソース)のファイルポインタ | |
dst | コピー先(ディスティネーション)のファイルポインタ | |
sz | コピー元(ソース)のサイズ |
0以上 | コピーしたサイズ | |
JBXL_MALLOC_ERROR | 作業用メモリが足りない. | |
JBXL_ARGS_ERROR | ファイルサイズの指定がおかしい. | |
JBXL_FILE_OPEN_ERROR | ソースファイルのオープン失敗. | |
JBXL_FILE_DESTOPEN_ERROR | ディスティネーションファイルのオープン失敗. |
Definition at line 2019 of file tools.c.
References JBXL_ARGS_ERROR, JBXL_FILE_DESTOPEN_ERROR, JBXL_FILE_OPEN_ERROR, JBXL_MALLOC_ERROR, and UNUSED.
02020 { 02021 unsigned char* buf; 02022 size_t rs; 02023 UNUSED(rs); 02024 02025 if (sz<=0) return JBXL_ARGS_ERROR; 02026 if (src==NULL) return JBXL_FILE_OPEN_ERROR; 02027 if (dst==NULL) return JBXL_FILE_DESTOPEN_ERROR; 02028 02029 buf = (unsigned char*)malloc(sz); 02030 if (buf==NULL) return JBXL_MALLOC_ERROR; 02031 02032 rs = fread(buf, sz, 1, src); 02033 sz = (int)fwrite(buf, sz, 1, dst); 02034 02035 free(buf); 02036 return sz; 02037 }
void fprint_escape | ( | FILE * | fp, | |
char * | fmt, | |||
char * | mesg | |||
) |
void fprint_escape(FILE* fp, char* fmt, char* mesg)
エスケープ文字を含むメッセージの出力.
現在は CR, LF のみ \r, \n に変換する.
fp | 出力先のファイルポインタ | |
fmt | 出力フォーマット.printf() に準拠. | |
mesg | エスケープ文字を含む文字列. |
Definition at line 4131 of file tools.c.
References change_esc(), and fprint_message().
04132 { 04133 char* pp; 04134 04135 if (fmt==NULL || mesg==NULL) return; 04136 04137 pp = change_esc(mesg); 04138 if (pp==NULL) return; 04139 04140 fprint_message(fp, fmt, pp); 04141 free(pp); 04142 }
void fprint_message | ( | FILE * | fp, | |
const char * | fmt, | |||
... | ||||
) |
void fprint_message(FILE *fp, const char* fmt, ...)
バッファリング無しのメッセージ出力
fp | 出力先のファイルポインタ | |
fmt | 出力フォーマット.printf() に準拠. |
Definition at line 4066 of file tools.c.
Referenced by fprint_escape().
04067 { 04068 char* nfmt; 04069 int len; 04070 04071 va_list args; 04072 va_start(args, fmt); 04073 04074 len = (int)strlen(fmt); 04075 nfmt = (char*)malloc(len + 1); 04076 if (nfmt==NULL) return; 04077 04078 strncpy(nfmt, fmt, len); 04079 nfmt[len] = '\0'; 04080 04081 vfprintf(fp, nfmt, args); 04082 fflush(fp); 04083 free(nfmt); 04084 04085 va_end(args); 04086 04087 return; 04088 }
void free_ringBuffer | ( | ringBuffer * | rb | ) |
void free_ringBuffer(ringBuffer* rb)
リングバッファのバッファ部を開放する.
rb | リングバッファへのポインタ |
Definition at line 3265 of file tools.c.
References ringBuffer::buf, freeNull, JBXL_NORMAL, and ringBuffer::state.
03266 { 03267 if (rb!=NULL) { 03268 freeNull(rb->buf); 03269 memset(rb, 0, sizeof(ringBuffer)); 03270 rb->state = JBXL_NORMAL; 03271 } 03272 }
char* ftostr | ( | float | n | ) |
char* ftostr_ts | ( | float | n | ) |
char* ftostr_ts(float n)
float型 nを文字列にして返す. Thread Safe
n | 文字列に変換する値 |
Definition at line 1637 of file tools.c.
References LDATA.
Referenced by make_xml_attr_byfloat().
01638 { 01639 char* str = NULL; 01640 str = (char*)malloc(LDATA); 01641 if (str==NULL) return NULL; 01642 01643 memset(str, 0, LDATA); 01644 snprintf(str, LDATA-1, "%f", n); 01645 return str; 01646 }
char* get_file_extension | ( | const char * | str | ) |
char* get_file_extension(const char* str)
フルパスからファイル名の拡張子へのポインタを取り出す.
str | ファイルのフルパス |
Definition at line 2215 of file tools.c.
Referenced by add_resource_list().
02216 { 02217 int sz, len; 02218 char* ext; 02219 02220 if (str==NULL) return NULL; 02221 02222 char pd = '.'; 02223 02224 #ifdef WIN32 02225 char cc = '\\'; 02226 #else 02227 char cc = '/'; 02228 #endif 02229 02230 len = (int)strlen(str); 02231 sz = 0; 02232 while (sz<len && str[len-1-sz]!=cc && str[len-1-sz]!=pd) sz++; 02233 02234 if (str[len-1-sz]!=pd) return NULL; 02235 ext = (char*)str + len - sz; 02236 02237 return ext; 02238 }
char* get_file_name | ( | const char * | str | ) |
char* get_file_name(const char* str)
フルパスからファイル名へのポインタを取り出す. str中のポインタを返すので,free() してはいけない.
str | ファイルのフルパス |
Definition at line 2050 of file tools.c.
Referenced by add_resource_list().
02051 { 02052 if (str==NULL) return NULL; 02053 02054 #ifdef WIN32 02055 char cc = '\\'; 02056 #else 02057 char cc = '/'; 02058 #endif 02059 02060 int len = (int)strlen(str); 02061 int sz = 0; 02062 while (sz<len && str[len-1-sz]!=cc) sz++; 02063 char* fnm = (char*)str + len - sz; 02064 02065 return fnm; 02066 }
char* get_file_path | ( | const char * | str | ) |
char* make_file_path(const char* str)
フルパスからパスを生成する.strは変化しない.要 free.
非推奨:get_file_path() を使え.
str | ファイルのフルパス |
ファイルパスからパス部分のみを得る.strは変化しない.要 free.
str | ファイルのパス |
Definition at line 2178 of file tools.c.
02179 { 02180 if (str==NULL || str[0]=='\0') return NULL; 02181 02182 int len = (int)strlen(str); 02183 char* path = (char*)malloc(len+1); 02184 memcpy(path, str, len+1); 02185 02186 #ifdef WIN32 02187 char cc = '\\'; 02188 #else 02189 char cc = '/'; 02190 #endif 02191 02192 int sz = len - 1; 02193 while (sz>=0 && path[sz]!=cc) sz--; 02194 02195 if (sz<0) { 02196 free(path); 02197 path = NULL; 02198 } 02199 else { 02200 path[sz+1] = '\0'; 02201 } 02202 02203 return path; 02204 }
unsigned long int get_free_memory | ( | void | ) |
unsigned long int get_free_memory(void)
未使用のメモリサイズを得る.
char* get_gmt_timestamp | ( | time_t | date, | |
const char * | format | |||
) |
Definition at line 469 of file tools.c.
Referenced by get_http_header_date().
00470 { 00471 char* buf = (char*)malloc(64); 00472 00473 struct tm tm = *gmtime(&date); 00474 //struct tm tm = *localtime(&date); 00475 strftime(buf, 63, format, &tm); 00476 00477 return buf; 00478 }
char* get_line | ( | char * | buf, | |
int | n | |||
) |
char* get_line(char* buf, int n)
文字型データstrのバッファ内の n行目を取り出す.改行コードは削除される.
取り出した行を char型変数のバッファに格納して返す.
バッファの最後が '\0' で終わっている場合,バッファを越えて行を読もうとした場合は NULL を返す.
'\0' で終わっていない場合,バッファが何処で終わりかを知る事は(簡単な方法では)できない.
返されたデータは free()する必要がある.
buf | 操作対象文の字列型データ(含む改行) | |
n | 行の指定.1 から数える. |
Definition at line 504 of file tools.c.
References CHAR_CR, and CHAR_LF.
Referenced by command_PASSWD(), and x2crypt().
00505 { 00506 int i, j, pos, cnt; 00507 char* ret = NULL; 00508 00509 if (buf==NULL) return NULL; 00510 00511 for(i=0,j=0; j<n-1; j++) { 00512 while (buf[i]!=CHAR_LF && buf[i]!=CHAR_CR && buf[i]!='\0') i++; 00513 while (buf[i]==CHAR_LF || buf[i]==CHAR_CR) i++; 00514 } 00515 if (buf[i]=='\0') return NULL; 00516 00517 pos = i; 00518 while (buf[i]!=CHAR_LF && buf[i]!=CHAR_CR && buf[i]!='\0') i++; 00519 cnt = i - pos; 00520 00521 if (cnt>=0) { 00522 ret = (char*)malloc(cnt+1); 00523 if (ret==NULL) return NULL; 00524 00525 for(i=0; i<cnt; i++) ret[i] = buf[pos+i]; 00526 ret[cnt] = '\0'; 00527 } 00528 return ret; 00529 }
char* get_local_timestamp | ( | time_t | date, | |
const char * | format | |||
) |
char* get_localtime(char 1, char c2, char c3, char c4)
非推奨.use get_local_timestamp(time(0), ....)
ローカルタイムを "年c1月c1日c2時c3分c3秒c4" の形式で返す.
返ってきた char* ポインタは free() してはいけない.
printf("%s\n", get_localtime('/', 'T', ':', 'Z')); 2021/08/16T15:04:56Z
char* get_localtime_ts(char c1, char c2, char c3, char c4)
非推奨.use get_local_timestamp(time(0), ....)
ローカルタイムを "年c1月c1日c2時c3分c3秒c4" の形式で返す.
返ってきた char* ポインタは free() すること.
unsigned char* get_mstream | ( | mstream * | sb | ) |
unsigned char* get_mstream(mstream* sb)
メッセージ(文字列)ストリーム sb から次のメッセージを取り出す.改行コードは削除される.
ここで,メッセージとは \r\n, \r または \n で区切られている文字列でのことである.
[in] | sb | メッセージストリームへのポインタ |
[out] | sb | state JBXL_NORMAL: ストリームは正常状態.JBXL_ERROR: ストリームは異常な状態にある.(未実装) |
NULL以外 | 取り出したストリームデータへのポインタ.要 free | |
NULL | データ取得失敗.現在有効なメッセージデータは無い.または単に失敗した. |
Definition at line 3508 of file tools.c.
References CHAR_CR, CHAR_LF, chomp(), get_ringBuffer(), JBXL_ERROR, and JBXL_NORMAL.
Referenced by fgets_mstream(), ssl_recv_mstream(), ssl_recv_mstream_Buffer(), ssl_tcp_recv_mstream(), ssl_tcp_recv_mstream_Buffer(), tcp_recv_mstream(), and tcp_recv_mstream_Buffer().
03509 { 03510 int n, len; 03511 unsigned char* pp; 03512 03513 if (sb==NULL) return NULL; 03514 sb->state = JBXL_NORMAL; 03515 if (sb->buf==NULL) return NULL; 03516 if (sb->datano==0) return NULL; 03517 03518 len = sb->npoint - sb->spoint; 03519 if (len==0) return NULL; 03520 else if (len<0) len += sb->bufsz; 03521 03522 pp = get_ringBuffer(sb, len); 03523 if (pp==NULL) { 03524 sb->state = JBXL_ERROR; 03525 return NULL; 03526 } 03527 chomp((char*)pp); 03528 03529 sb->datano += -1; 03530 sb->spoint = sb->npoint; 03531 03532 if (sb->datano>=1) { 03533 int m; 03534 n = sb->spoint; 03535 while (n!=sb->epoint) { 03536 m = (n + 1) % sb->bufsz; 03537 if (sb->buf[n]==CHAR_LF || (sb->buf[n]==CHAR_CR && sb->buf[m]!=CHAR_LF)) { 03538 sb->npoint = m; 03539 break; 03540 } 03541 n = m; 03542 } 03543 } 03544 03545 return pp; 03546 }
unsigned char* get_ringBuffer | ( | ringBuffer * | rb, | |
int | sz | |||
) |
unsigned char* get_ringBuffer(ringBuffer* rb, int sz)
リングバッファ rb から szバイトのデータを取り出す.
返されたデータは free()する必要がある.
[in] | rb | リングバッファへのポインタ |
[out] | rb | state JBXL_NORMAL: バッファは正常状態.JBXL_ERROR: バッファは異常な状態にある. |
sz | 取り出すバイト数. |
NULL以外 | 取り出したデータへのポインタ.データサイズは sz + 1.要 free | |
NULL | データ取得失敗.現在有効なデータサイズはszより小さい.または単に失敗した. |
Definition at line 3355 of file tools.c.
References ringBuffer::buf, ringBuffer::bufsz, ringBuffer::datasz, and ringBuffer::spoint.
Referenced by get_mstream().
03356 { 03357 unsigned char* pp; 03358 03359 if (rb==NULL) return NULL; 03360 if (rb->buf==NULL) return NULL; 03361 if (sz>rb->datasz) return NULL; 03362 03363 pp = (unsigned char*)malloc(sz + 1); 03364 if (pp==NULL) return NULL; 03365 memset(pp, 0, sz + 1); 03366 03367 if (rb->spoint+sz<=rb->bufsz) { 03368 memcpy(pp, &(rb->buf[rb->spoint]), sz); 03369 rb->spoint = rb->spoint + sz; 03370 if (rb->spoint==rb->bufsz) rb->spoint = 0; 03371 } 03372 else { 03373 memcpy(pp, &(rb->buf[rb->spoint]), rb->bufsz-rb->spoint); 03374 memcpy(&(pp[rb->bufsz-rb->spoint]), rb->buf, sz-(rb->bufsz-rb->spoint)); 03375 rb->spoint = rb->spoint + sz - rb->bufsz; 03376 } 03377 03378 rb->datasz -= sz; 03379 return pp; 03380 }
char* get_seq_data | ( | char * | buf, | |
int * | ptr | |||
) |
char* get_seq_data(char* buf, int* ptr)
文字型データ bufのバッファ内の行データをシーケンシャルに取り出す.
改行コードは削除される.連続して呼び出す場合,一番最初は *ptrに 0を設定し,以後は *ptrの内容は変えない.
取り出した行を char型変数のバッファに格納して返す.
バッファの最後が '\0' で終わっている場合,バッファを越えて行を読もうとした時は NULL を返す.
'\0' で終わっていない場合,バッファが何処で終わりかを知る事は(簡単な方法では)できない.
返されたデータは free() する必要がある.
[in] | buf | 操作対象文の字列型データ(含む改行) |
[in] | ptr | 読み込みを開始するデータの位置(バイト). |
[out] | ptr | 次のデータが始まる位置(バイト). |
Definition at line 550 of file tools.c.
References CHAR_CR, and CHAR_LF.
00551 { 00552 int pos, cnt; 00553 char* ret = NULL; 00554 00555 if (buf==NULL || buf[*ptr]=='\0') return NULL; 00556 00557 pos = *ptr; 00558 while (buf[*ptr]!=CHAR_LF && buf[*ptr]!=CHAR_CR && buf[*ptr]!='\0') (*ptr)++; 00559 cnt = *ptr - pos; 00560 00561 if (cnt>=0) { 00562 ret = (char*)malloc(cnt+1); 00563 if (ret==NULL) return NULL; 00564 00565 int i; 00566 for(i=0; i<cnt; i++) ret[i] = buf[pos+i]; 00567 ret[cnt] = '\0'; 00568 } 00569 00570 while (buf[*ptr]==CHAR_LF || buf[*ptr]==CHAR_CR) (*ptr)++; 00571 return ret; 00572 }
unsigned long int get_used_memory | ( | void | ) |
unsigned long int get_used_memory(void)
使用中のメモリサイズを得る.
unsigned char* guid2uuid | ( | unsigned char * | p | ) |
unsigned char* guid2uuid(unsigned char* p)
テキストのGUID をバイナリのUUID に変換する.要 free()
入力が GUIDの形式でない時は,処理結果は保証されない.
p | テキストの GUID |
Definition at line 3633 of file tools.c.
03634 { 03635 int i, j; 03636 unsigned char* uuid; 03637 03638 if (p==NULL) return NULL; 03639 03640 uuid = (unsigned char*)malloc(16); 03641 if (uuid==NULL) return NULL; 03642 03643 i = j = 0; 03644 while (p[i]!='\0' && j<16) { 03645 if (p[i]!='-' && p[i+1]!='\0') { 03646 unsigned char hb, lb; 03647 03648 if (p[i]>='0' && p[i]<='9') hb = p[i] - '0'; 03649 else if (p[i]>='a' && p[i]<='f') hb = p[i] - 'a' + 10; 03650 else if (p[i]>='A' && p[i]<='F') hb = p[i] - 'A' + 10; 03651 else hb = '\0'; 03652 03653 if (p[i+1]>='0' && p[i+1]<='9') lb = p[i+1] - '0'; 03654 else if (p[i+1]>='a' && p[i+1]<='f') lb = p[i+1] - 'a' + 10; 03655 else if (p[i+1]>='A' && p[i+1]<='F') lb = p[i+1] - 'A' + 10; 03656 else lb = '\0'; 03657 03658 uuid[j] = (hb<<4) + lb; 03659 i++; 03660 j++; 03661 } 03662 i++; 03663 } 03664 03665 return uuid; 03666 }
int hexstr2i | ( | const char * | str | ) |
16進数の文字列を整数に変換する.
空白は無視する.空白以外の16進数でない文字が出現したら,そこで変換を止める
str | 整数に変換する 16進の文字列 |
Definition at line 1714 of file tools.c.
Referenced by get_chunked_size().
01715 { 01716 int i, ret = 0; 01717 if (str==NULL) return ret; 01718 01719 int len = (int)strlen(str); 01720 01721 for (i=0; i<len; i++) { 01722 if (str[i]>='0' && str[i]<='9') { 01723 ret = ret*16; 01724 ret += (int)(str[i] - '0'); 01725 } 01726 else if (str[i]>='A' && str[i]<='F') { 01727 ret = ret*16; 01728 ret += (int)(str[i] - 'A') + 10; 01729 } 01730 else if (str[i]>='a' && str[i]<='f') { 01731 ret = ret*16; 01732 ret += (int)(str[i] - 'a') + 10; 01733 } 01734 else if (str[i]!=' ') { 01735 break; 01736 } 01737 } 01738 01739 return ret; 01740 }
void ignore_sigterm_child | ( | void | ) |
以後 child プロセスの終了を無視する.
void init_rand | ( | void | ) |
void init_rand(void)
/dev/urandom から乱数の系列を初期化する
/dev/urandom が読めない場合は,呼び出された時の時間(秒数)によって乱数の系列を初期化する.
Definition at line 1755 of file tools.c.
References UNUSED.
01756 { 01757 FILE* fp; 01758 unsigned int seed; 01759 size_t sz; 01760 UNUSED(sz); 01761 01762 fp = fopen("/dev/urandom", "rb"); 01763 if (fp==NULL) { 01764 srand(time(NULL)); 01765 return; 01766 } 01767 sz = fread(&seed, sizeof(unsigned int), 1, fp); 01768 fclose(fp); 01769 01770 srand(seed); 01771 }
ringBuffer init_ringBuffer | ( | void | ) |
初期化された ringBuffer変数を返す.
Definition at line 3218 of file tools.c.
References JBXL_NORMAL, and ringBuffer::state.
03219 { 03220 ringBuffer rb; 03221 03222 memset(&rb, 0, sizeof(ringBuffer)); 03223 rb.state = JBXL_NORMAL; 03224 03225 return rb; 03226 }
int int_from_big_endian | ( | void * | ptr | ) |
int int_from_big_endian(void* ptr)
Big Endian形式で格納されている int型の値を取り出す.
ptr | 変数が格納されているメモリへのポインタ |
Definition at line 312 of file tools.c.
References check_endian(), HostEndian, LITTLE_ENDIAN, reverse_str(), and UNKNOWN_ENDIAN.
Referenced by read_shape_index_file(), and read_shape_main_file().
00313 { 00314 int ret = *((int*)ptr); 00315 00316 if (HostEndian==UNKNOWN_ENDIAN) check_endian(); 00317 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 4); 00318 return ret; 00319 }
int int_from_little_endian | ( | void * | ptr | ) |
int int_from_little_endian(void* ptr)
Little Endian形式で格納されている int型の値を取り出す.
ptr | 変数が格納されているメモリへのポインタ |
Definition at line 198 of file tools.c.
References BIG_ENDIAN, check_endian(), HostEndian, reverse_str(), and UNKNOWN_ENDIAN.
Referenced by draw_shape_polygon(), read_shape_index_file(), and read_shape_main_file().
00199 { 00200 int ret = *((int*)ptr); 00201 00202 if (HostEndian==UNKNOWN_ENDIAN) check_endian(); 00203 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 4); 00204 return ret; 00205 }
int is_big_endian | ( | void | ) |
エンディアンの動的チェック
一度呼び出すと,大域変数 HostEndian に LITTLE_ENDIAN か BIG_ENDIAN が設定される.
TRUE | Big Endian | |
FALSE | Little Endian |
Definition at line 116 of file tools.c.
References BIG_ENDIAN, FALSE, HostEndian, LITTLE_ENDIAN, and TRUE.
Referenced by get_tiff_ifd().
00117 { 00118 unsigned char x[] = {0x00, 0x01}; 00119 00120 if (HostEndian==BIG_ENDIAN) return TRUE; 00121 00122 else if (HostEndian==LITTLE_ENDIAN) return FALSE; 00123 00124 else { 00125 unsigned short* xx = (unsigned short*)x; 00126 if (*xx==1) { 00127 HostEndian = BIG_ENDIAN; 00128 return TRUE; 00129 } 00130 else { 00131 HostEndian = LITTLE_ENDIAN; 00132 return FALSE; 00133 } 00134 } 00135 }
int is_little_endian | ( | void | ) |
エンディアンの動的チェック
一度呼び出すと,大域変数 HostEndian に LITTLE_ENDIAN か BIG_ENDIAN が設定される.
TRUE | Little Endian | |
FALSE | Big Endian |
Definition at line 81 of file tools.c.
References BIG_ENDIAN, FALSE, HostEndian, LITTLE_ENDIAN, and TRUE.
Referenced by check_endian(), get_tiff_ifd(), ntohull(), and read_user_data().
00082 { 00083 unsigned char x[] = {0x01, 0x00}; 00084 00085 if (HostEndian==LITTLE_ENDIAN) return TRUE; 00086 00087 else if (HostEndian==BIG_ENDIAN) return FALSE; 00088 00089 else { 00090 unsigned short* xx = (unsigned short*)x; 00091 if (*xx==1) { 00092 HostEndian = LITTLE_ENDIAN; 00093 return TRUE; 00094 } 00095 else { 00096 HostEndian = BIG_ENDIAN; 00097 return FALSE; 00098 } 00099 } 00100 }
int isNull | ( | void * | p | ) |
int isNull(void* p)
ポインタが NULLかどうかを検査する.
Windowsの場合,無効ポインタも検出する.
p | 検査するポインタ. |
TRUE | ポインタがNULL,または無効(Windowsの場合) | |
FALSE | ポインタはNULLではなく有効(Windowsの場合)である. |
char* itostr | ( | int | n | ) |
char* itostr_ts | ( | int | n | ) |
char* itostr_ts(int n)
int型 nを文字列にして返す.Thread Safe
n | 文字列に変換する値 |
Definition at line 1532 of file tools.c.
References LDATA.
Referenced by _tcp_bind(), _tcp_bind_setopt(), _tcp_client_bind_socket(), _tcp_client_socket(), _tcp_connect(), _tcp_server_bind(), _tcp_server_bind_setopt(), _tcp_server_socket(), _tcp_server_socket_setopt(), _udp_bind(), _udp_bind_setopt(), _udp_client_socket(), _udp_server_socket(), _udp_server_socket_setopt(), llsd_bin_main_parse(), make_xml_attr_byint(), open_ldap_connection(), recv_http_Buffer(), recv_http_file(), recv_https_Buffer(), and recv_https_file().
01533 { 01534 char* str = NULL; 01535 str = (char*)malloc(LDATA); 01536 if (str==NULL) return NULL; 01537 01538 memset(str, 0, LDATA); 01539 snprintf(str, LDATA-1, "%d", n); 01540 return str; 01541 }
void kanji_convert | ( | unsigned char * | mesg | ) |
void kanji_convert(unsigned char* mesg)
大域変数 KnjiCodeに従って漢字コードを変換する.
[in,out] | mesg | 変換する文字列を持つ unsigned char*型データ.内容が書き換えられる. |
Definition at line 2583 of file tools.c.
References CODE_SJIS, kanji_convert_euc2sjis(), and KanjiCode.
02584 { 02585 if (KanjiCode==CODE_SJIS) { 02586 kanji_convert_euc2sjis(mesg); 02587 } 02588 }
void kanji_convert_euc2sjis | ( | unsigned char * | mesg | ) |
void kanji_convert_euc2sjis(unsigned char* mesg)
EUCをSJISに変換する.
[in,out] | mesg | 変換する文字列を持つ unsigned char*型データ.内容が書き換えられる. |
Definition at line 2599 of file tools.c.
References euc2sjis().
Referenced by kanji_convert().
02600 { 02601 int i = 0; 02602 while(mesg[i]!='\0' && mesg[i+1]!='\0'){ 02603 if (mesg[i]>=0xa1 && mesg[i]<=0xfe){ // EUC 02604 euc2sjis(&mesg[i], &mesg[i+1]); 02605 i = i + 2; 02606 } 02607 else i++; 02608 } 02609 }
void kanji_convert_sjis2euc | ( | unsigned char * | mesg | ) |
void kanji_convert_sjis2euc(unsigned char* mesg)
SJISをEUCに変換する.
[in,out] | mesg | 変換する文字列を持つ unsigned char*型データ.内容が書き換えられる. |
Definition at line 2620 of file tools.c.
References sjis2euc().
02621 { 02622 int i = 0; 02623 while(mesg[i]!='\0' && mesg[i+1]!='\0'){ 02624 // if文が変則的なのは,コンパイラで警告が出るため (GCC) 3.3.2 20031218 02625 if ((mesg[i]>=0x81 && mesg[i]<=0x9f) || 02626 (mesg[i]>=0xe0 && mesg[i]<=0xfe) || mesg[i]==0xff) { // SJIS 02627 sjis2euc(&mesg[i], &mesg[i+1]); 02628 i = i + 2; 02629 } 02630 else i++; 02631 } 02632 }
char* lltostr | ( | long long int | n | ) |
char* lltostr_ts | ( | long long int | n | ) |
char* lltostr_ts(long long int n)
long long int型 nを文字列にして返す.Thread Safe
n | 文字列に変換する値 |
Definition at line 1595 of file tools.c.
References LDATA.
char* ltostr | ( | long int | n | ) |
char* ltostr_ts | ( | long int | n | ) |
char* ltostr_ts(long int n)
long int型 nを文字列にして返す.Thread Safe
n | 文字列に変換する値 |
Definition at line 1553 of file tools.c.
References LDATA.
ringBuffer make_ringBuffer | ( | int | sz | ) |
ringBuffer make_ringBuffer(int sz)
バッファ部が存在するリングバッファを作り出す. バッファ部は free()する必要がある.
sz | リングバッファのバッファ部のサイズ |
Definition at line 3239 of file tools.c.
References ringBuffer::buf, ringBuffer::bufsz, JBXL_NORMAL, and ringBuffer::state.
03240 { 03241 ringBuffer rb; 03242 03243 memset(&rb, 0, sizeof(ringBuffer)); 03244 03245 if (sz>0) { 03246 rb.buf = (unsigned char*)malloc(sz); 03247 if (rb.buf==NULL) return rb; 03248 memset(rb.buf, 0, sz); 03249 rb.bufsz = sz; 03250 rb.state = JBXL_NORMAL; 03251 } 03252 03253 return rb; 03254 }
ringBuffer* new_ringBuffer | ( | int | sz | ) |
ringBuffer* new_ringBuffer(int sz)
リングバッファ型変数を生成する.
返されたデータは del_ringBuffer() する必要がある.
Definition at line 3170 of file tools.c.
References ringBuffer::buf, ringBuffer::bufsz, JBXL_NORMAL, and ringBuffer::state.
03171 { 03172 ringBuffer* rb; 03173 03174 rb = (ringBuffer*)malloc(sizeof(ringBuffer)); 03175 if (rb==NULL) return NULL; 03176 memset(rb, 0, sizeof(ringBuffer)); 03177 rb->state = JBXL_NORMAL; 03178 03179 if (sz>0) { 03180 rb->buf = (unsigned char*)malloc(sz); 03181 if (rb->buf==NULL) return rb; 03182 memset(rb->buf, 0, sz); 03183 rb->bufsz = sz; 03184 } 03185 return rb; 03186 }
unsigned long long int ntohull | ( | unsigned long long int | s | ) |
Definition at line 1835 of file tools.c.
References is_little_endian().
Referenced by llsd_bin_get_date(), and llsd_bin_get_real().
01836 { 01837 if (is_little_endian()) { 01838 long long int d; 01839 uByte* src = (uByte*)&s; 01840 uByte* dst = (uByte*)&d; 01841 dst[0] = src[7]; 01842 dst[1] = src[6]; 01843 dst[2] = src[5]; 01844 dst[3] = src[4]; 01845 dst[4] = src[3]; 01846 dst[5] = src[2]; 01847 dst[6] = src[1]; 01848 dst[7] = src[0]; 01849 return d; 01850 } 01851 return s; 01852 }
char* numbering_name | ( | const char * | fmt, | |
int | n | |||
) |
char* numbering_name(const char* fmt, int n)
フォーマット fmtに従って,nを含む文字列を作り出す. 返されたデータは free()する必要がある.
fmt | フォーマット用文字列.ex. "%d %f\n" see printf() | |
n | 文字に変換する整数. |
Definition at line 2551 of file tools.c.
References LNAME.
02552 { 02553 int len; 02554 char fname[LNAME], *fo; 02555 02556 memset(fname, 0, LNAME); 02557 snprintf(fname, LNAME-1, fmt, n); 02558 len = (int)strlen(fname); 02559 02560 fo = (char*)malloc(len + 1); 02561 if (fo==NULL) return NULL; 02562 02563 memset(fo, 0, len+1); 02564 strncpy(fo, fname, len); 02565 return fo; 02566 }
void open_errfile | ( | void | ) |
void open_errfile(void)
デフォルトのエラーファイルをオープンする
Definition at line 3951 of file tools.c.
References JBXL_ERR_FILE.
03952 { 03953 if (FP_ErrFile!=NULL) return; 03954 03955 FP_LogFile = fopen(JBXL_ERR_FILE, "a"); 03956 return; 03957 }
void open_logfile | ( | void | ) |
void open_logfile(void)
デフォルトのログファイルをオープンする
Definition at line 3873 of file tools.c.
References JBXL_LOG_FILE.
03874 { 03875 if (FP_LogFile!=NULL) return; 03876 03877 FP_LogFile = fopen(JBXL_LOG_FILE, "a"); 03878 return; 03879 }
char* pack_char_len | ( | char * | mesg, | |
char | cc, | |||
int | len | |||
) |
char* pack_char(char* mesg, char cc)
文字列中及び,先頭のcc(複数),終わりのcc(複数),CR, LF を削除
タブは空白に変換.メッセージ中の連続する cc は 1個に変換. 返されたデータは free()する必要がある.
CR, LF も削除(無視)されるので注意.
mesg | 操作対象の文字列 | |
cc | 削除する文字 |
文字列の一部の先頭のcc(複数),終わりのcc(複数),CR, LF を削除
タブは空白に変換.メッセージ中の連続する cc は 1個に変換. 返されたデータは free()する必要がある.
CR, LF も削除(無視)されるので注意.
mesg | 操作対象の文字列 | |
cc | 削除する文字 | |
len | 操作する文字列の長さ |
Definition at line 1193 of file tools.c.
References CHAR_CR, CHAR_LF, CHAR_TAB, OFF, and ON.
01194 { 01195 int i, j; 01196 int sf = OFF; // 連続 cc 用のフラグ 01197 int ff = ON; // 先頭の cc を無視するためのフラグ 01198 char* pp; 01199 01200 if (mesg==NULL) return NULL; 01201 01202 if (len==0) return NULL; 01203 if (len<0) len = (int)strlen(mesg); 01204 pp = (char*)malloc(len+1); 01205 if (pp==NULL) return NULL; 01206 01207 i = j = 0; 01208 while(mesg[i]!='\0' && i<len) { 01209 if (mesg[i]==CHAR_TAB) mesg[i] = ' '; 01210 if (mesg[i]!=CHAR_CR && mesg[i]!=CHAR_LF) { // CR LF を読み飛ばす. 01211 if (mesg[i]==cc) { 01212 if (sf==OFF) { 01213 sf = ON; 01214 if (ff==ON) ff = OFF; 01215 else pp[j++] = mesg[i]; 01216 } 01217 } 01218 else { 01219 sf = ff = OFF; 01220 pp[j++] = mesg[i]; 01221 } 01222 } 01223 i++; 01224 } 01225 pp[j] = '\0'; 01226 01227 // 末尾の cc を削除 01228 i = (int)strlen(pp) - 1; 01229 while(i>=0) { 01230 if (pp[i]==cc) i--; 01231 else break; 01232 } 01233 pp[i+1] = '\0'; 01234 01235 return pp; 01236 }
char* pack_head_tail_char | ( | char * | mesg, | |
char | cc | |||
) |
char* pack_head_tail_char(char* mesg, char cc)
文字列の先頭のcc(複数),終わりのcc(複数),TAB, CR, LF を削除
文字列の先頭,終わり部分でない場所にある ccは削除されない. 返されたデータは free()する必要がある.
mesg | 操作対象の文字列 | |
cc | 削除する文字 |
Definition at line 1129 of file tools.c.
References CHAR_CR, CHAR_LF, and CHAR_TAB.
Referenced by xml_parse_content(), and xml_parse_end_node().
01130 { 01131 int sz; 01132 char* ps; 01133 char* pe; 01134 char* pp; 01135 01136 if (mesg==NULL) return NULL; 01137 01138 ps = mesg; 01139 while(*ps==cc || *ps==CHAR_TAB || *ps==CHAR_LF || *ps==CHAR_CR) ps++; 01140 pe = ps; 01141 while(*pe!='\0') pe++; 01142 pe--; 01143 while(*pe==cc || *pe==CHAR_TAB || *pe==CHAR_LF || *pe==CHAR_CR) pe--; 01144 01145 sz = (int)(pe - ps) + 1; 01146 pp = (char*)malloc((size_t)(sz + 1)); 01147 memcpy(pp, ps, sz); 01148 pp[sz] = '\0'; 01149 01150 return pp; 01151 }
void print_16x | ( | FILE * | fp, | |
unsigned char * | mesg, | |||
int | n | |||
) |
void print_16x(FILE* fp, unsigned char* mesg, int n)
デバッグ用 16進一行出力.
mesgの nバイトの16進を一行,空白なしで表示する.n<0 の場合は 文字列とみなす.
fp | 出力するファイルへのポインタ.NULLの場合は stderr | |
mesg | 表示するデータ. | |
n | 表示するバイト数 |
void print_errfile | ( | const char * | fmt, | |
... | ||||
) |
void print_errfile(const char* fmt, ...)
デフォルトのエラーファイルにデータを書き込む
Definition at line 3983 of file tools.c.
References FALSE, JBXL_ERR_FILE, and TRUE.
03984 { 03985 char* nfmt; 03986 int len; 03987 int slfopn = FALSE; 03988 03989 // 03990 if (FP_ErrFile==NULL) { 03991 FP_ErrFile = fopen(JBXL_ERR_FILE, "a"); 03992 if (FP_ErrFile==NULL) return; 03993 slfopn = TRUE; 03994 } 03995 03996 va_list args; 03997 va_start(args, fmt); 03998 03999 len = (int)strlen(fmt); 04000 nfmt = (char*)malloc(len + 2); 04001 if (nfmt==NULL) return; 04002 04003 strncpy(nfmt, fmt, len); 04004 nfmt[len] = '\n'; 04005 nfmt[len+1] = '\0'; 04006 04007 vfprintf(FP_ErrFile, nfmt, args); 04008 fflush(FP_ErrFile); 04009 free(nfmt); 04010 04011 va_end(args); 04012 04013 // 04014 if (slfopn && FP_ErrFile!=NULL) { 04015 fclose(FP_ErrFile); 04016 FP_ErrFile = NULL; 04017 } 04018 04019 return; 04020 }
void print_escape | ( | const char * | fmt, | |
char * | mesg | |||
) |
void print_escape(const char* fmt, const char* mesg)
エスケープ文字を含むメッセージの出力.(stderr)
現在は CR, LF のみ \r, \n に変換する.see change_esc()
fmt | 出力フォーマット.printf() に準拠. | |
mesg | エスケープ文字を含む文字列. |
Definition at line 4103 of file tools.c.
References change_esc(), and PRINT_MESG.
04104 { 04105 char* pp; 04106 04107 if (fmt==NULL || mesg==NULL) return; 04108 04109 pp = change_esc(mesg); 04110 if (pp==NULL) return; 04111 04112 PRINT_MESG(fmt, pp); 04113 free(pp); 04114 }
void print_logfile | ( | const char * | fmt, | |
... | ||||
) |
void print_logfile(const char* fmt, ...)
デフォルトのログファイルにデータを書き込む
Definition at line 3905 of file tools.c.
References FALSE, JBXL_LOG_FILE, and TRUE.
03906 { 03907 char* nfmt; 03908 int len; 03909 int slfopn = FALSE; 03910 03911 // 03912 if (FP_LogFile==NULL) { 03913 FP_LogFile = fopen(JBXL_LOG_FILE, "a"); 03914 if (FP_LogFile==NULL) return; 03915 slfopn = TRUE; 03916 } 03917 03918 va_list args; 03919 va_start(args, fmt); 03920 03921 len = (int)strlen(fmt); 03922 nfmt = (char*)malloc(len + 2); 03923 if (nfmt==NULL) return; 03924 03925 strncpy(nfmt, fmt, len); 03926 nfmt[len] = '\n'; 03927 nfmt[len+1] = '\0'; 03928 03929 vfprintf(FP_LogFile, nfmt, args); 03930 fflush(FP_LogFile); 03931 free(nfmt); 03932 03933 va_end(args); 03934 03935 // 03936 if (slfopn && FP_LogFile!=NULL) { 03937 fclose(FP_LogFile); 03938 FP_LogFile = NULL; 03939 } 03940 03941 return; 03942 }
void print_message | ( | const char * | fmt, | |
... | ||||
) |
void print_message(const char* fmt, ...)
バッファリング無しのメッセージ出力(stderr)
fmt | 出力フォーマット.printf() に準拠. |
Definition at line 4031 of file tools.c.
Referenced by print_protocol_header().
04032 { 04033 char* nfmt; 04034 int len; 04035 04036 va_list args; 04037 va_start(args, fmt); 04038 04039 len = (int)strlen(fmt); 04040 nfmt = (char*)malloc(len + 1); 04041 if (nfmt==NULL) return; 04042 04043 strncpy(nfmt, fmt, len); 04044 nfmt[len] = '\0'; 04045 04046 vfprintf(stderr, nfmt, args); 04047 fflush(stderr); 04048 free(nfmt); 04049 04050 va_end(args); 04051 04052 return; 04053 }
int put_mstream | ( | mstream * | sb, | |
unsigned char * | mesg | |||
) |
int put_mstream(mstream* sb, unsigned char* mesg)
メッセージ(文字列)ストリーム sb へメッセージ(の一部)を格納する.
ここで,メッセージとは \r\n, \r または \n で区切られている文字列でのことである.
[in] | sb | メッセージストリームへのポインタ |
[out] | sb | state JBXL_NORMAL: ストリームは正常状態.JBXL_ERROR: ストリームは異常な状態にある. |
mesg | 格納するメッセージ,またはその一部 |
0以上 | 書き込んだバイト数(CRLFを含む) | |
JBXL_ARGS_ERROR | 引数にNULLのデータがある. | |
JBXL_TOOLS_BUF_ERROR | バッファ(データ格納)部の領域がない. | |
JBXL_TOOLS_BUFSZ_ERROR | バッファ(データ格納)部の大きさがたりない. |
Definition at line 3466 of file tools.c.
References CHAR_CR, CHAR_LF, JBXL_ARGS_ERROR, JBXL_ERROR, JBXL_NORMAL, JBXL_TOOLS_BUF_ERROR, and put_ringBuffer().
Referenced by fgets_mstream(), ssl_recv_mstream(), ssl_recv_mstream_Buffer(), ssl_tcp_recv_mstream(), ssl_tcp_recv_mstream_Buffer(), tcp_recv_mstream(), and tcp_recv_mstream_Buffer().
03467 { 03468 int i, n, m, cc, np=0, len; 03469 03470 if (sb==NULL) return JBXL_ARGS_ERROR; 03471 sb->state = JBXL_NORMAL; 03472 if (mesg==NULL) return JBXL_ARGS_ERROR; 03473 if (sb->buf==NULL) return JBXL_TOOLS_BUF_ERROR; 03474 03475 len = (int)strlen((const char*)mesg); 03476 for (i=0, n=0, m=0; i<len; i++) { 03477 if (mesg[i]==CHAR_LF || (mesg[i]==CHAR_CR && mesg[i+1]!=CHAR_LF)) { 03478 if (m==0) m = i; 03479 n++; 03480 } 03481 } 03482 if (sb->datano==0 && n>=1) np = (sb->epoint + m + 1) % sb->bufsz; 03483 03484 cc = put_ringBuffer(sb, mesg, len); 03485 if (cc>=0) { 03486 if (sb->datano==0 && n>=1) sb->npoint = np; 03487 sb->datano += n; 03488 } 03489 03490 if (cc<0) sb->state = JBXL_ERROR; 03491 return cc; 03492 }
int put_ringBuffer | ( | ringBuffer * | rb, | |
unsigned char * | pp, | |||
int | sz | |||
) |
int put_ringBuffer(ringBuffer* rb, unsigned char* pp, int sz)
リングバッファ rb へデータを szバイト格納する.
[in] | rb | リングバッファへのポインタ |
[out] | rb | state JBXL_NORMAL: バッファは正常状態.JBXL_ERROR: バッファは異常な状態にある. |
pp | 格納するデータへのポインタ. | |
sz | 格納するデータのサイズ(Byte) |
0以上 | 書き込んだバイト数. | |
JBXL_ARGS_ERROR | 引数にNULLのデータがある. | |
JBXL_TOOLS_BUF_ERROR | バッファ(データ格納)部の領域がない. | |
JBXL_TOOLS_BUFSZ_ERROR | バッファ(データ格納)部の大きさがたりない.データはputされなかった. |
Definition at line 3313 of file tools.c.
References ringBuffer::buf, ringBuffer::bufsz, ringBuffer::datasz, ringBuffer::epoint, JBXL_ARGS_ERROR, JBXL_ERROR, JBXL_NORMAL, JBXL_TOOLS_BUF_ERROR, JBXL_TOOLS_BUFSZ_ERROR, and ringBuffer::state.
Referenced by put_mstream().
03314 { 03315 if (rb==NULL) return JBXL_ARGS_ERROR; 03316 rb->state = JBXL_NORMAL; 03317 03318 if (pp==NULL) return JBXL_ARGS_ERROR; 03319 if (rb->buf==NULL) return JBXL_TOOLS_BUF_ERROR; 03320 if (rb->datasz+sz>rb->bufsz) { 03321 rb->state = JBXL_ERROR; 03322 return JBXL_TOOLS_BUFSZ_ERROR; 03323 } 03324 03325 if (rb->epoint+sz<=rb->bufsz) { 03326 memcpy(&(rb->buf[rb->epoint]), pp, sz); 03327 rb->epoint = rb->epoint + sz; 03328 if (rb->epoint==rb->bufsz) rb->epoint = 0; 03329 } 03330 else { 03331 memcpy(&(rb->buf[rb->epoint]), pp, rb->bufsz-rb->epoint); 03332 memcpy(rb->buf, &(pp[rb->bufsz-rb->epoint]), sz-(rb->bufsz-rb->epoint)); 03333 rb->epoint = rb->epoint + sz - rb->bufsz; 03334 } 03335 03336 rb->datasz += sz; 03337 return sz; 03338 }
unsigned char* randbit | ( | int | n | ) |
unsigned char* randbit(int n)
ランダムに n bitのバイナリを生成する. 返されたデータは free()する必要がある.
n | 出力する bit数. |
Definition at line 1814 of file tools.c.
References setBit.
01815 { 01816 int i, sz; 01817 unsigned char* bin; 01818 01819 sz = (n+7)/8; 01820 bin = (unsigned char*)malloc(sz); 01821 if (bin==NULL) return NULL; 01822 01823 memset(bin, 0, sz); 01824 for (i=0; i<n; i++) setBit(bin, i, rand()%2); 01825 01826 return bin; 01827 }
char* randstr | ( | int | n | ) |
char* randstr(int n)
ランダムに A-Za-z0-9 までの文字を n文字生成する. 返されたデータは free()する必要がある.
n | 出力する文字数. |
Definition at line 1786 of file tools.c.
Referenced by command_USERID(), and temp_filename().
01787 { 01788 char base[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 01789 char* pass; 01790 int i, sz; 01791 01792 if (n<=0) return NULL; 01793 pass = (char*)malloc(n+1); 01794 if (pass==NULL) return pass; 01795 01796 sz = (int)strlen(base); 01797 for (i=0; i<n; i++) pass[i] = base[rand()%sz]; 01798 pass[n] = '\0'; 01799 01800 return pass; 01801 }
unsigned char* read_file | ( | const char * | fname, | |
unsigned long int * | size | |||
) |
unsigned char* read_file(const char* fname, unsigned long int* size)
ファイルを読み込んで,データへのポインタを返す.
fname | ファイル名 | |
size | 読み込んだデータのサイズを返す. |
Definition at line 2456 of file tools.c.
References file_size(), and UNUSED.
Referenced by read_tiff_file().
02457 { 02458 size_t rs; 02459 UNUSED(rs); 02460 02461 if (size==NULL) return NULL; 02462 02463 *size = file_size(fname); 02464 if (*size<=0) return NULL; 02465 02466 unsigned char* buf = (unsigned char*)malloc(*size); 02467 if (buf==NULL) return NULL; 02468 02469 FILE* fp = fopen(fname, "rb"); 02470 if (fp==NULL) { 02471 free(buf); 02472 return NULL; 02473 } 02474 02475 rs = fread(buf, *size, 1, fp); 02476 fclose(fp); 02477 02478 return buf; 02479 }
unsigned char* ref_ringBuffer | ( | ringBuffer * | rb, | |
int | pos | |||
) |
unsigned char* ref_ringBuffer(ringBuffer* rb, int pos)
リングバッファ rb の spoint + pos の位置にあるデータへの参照.
rb | リングバッファへのポインタ | |
pos | 参照するデータの spoint からの位置. |
参照データへのポインタ. |
Definition at line 3429 of file tools.c.
References ringBuffer::buf, ringBuffer::bufsz, ringBuffer::datasz, and ringBuffer::spoint.
char* replace_str | ( | char * | buf, | |
int | len, | |||
const char * | frm, | |||
const char * | tos | |||
) |
char* replace_str(char* buf, int len, const char* frm, const char* tos)
buf中の文字列 frmを tosで置き換える.
bufには十分な領域がなければならない.frmは bufとメモリ領域が重なってはいけない.
失敗した場合は NULLを返し,bufの内容は変化しない.
[in] | buf | 操作対象の文字列 |
[out] | buf | 変換された文字列 |
len | bufの領域の大きさ(長さ)'\0'を含む | |
frm | 変換する文字列 | |
tos | 変換後の文字列 |
Definition at line 1297 of file tools.c.
Referenced by bvh_get_seq_data().
01298 { 01299 char* wrk = NULL; 01300 int i, j, k, slen, flen, tlen; 01301 01302 if (buf==NULL || frm==NULL || tos==NULL) return NULL; 01303 01304 wrk = (char*)malloc(len); 01305 if (wrk==NULL) return NULL; 01306 01307 slen = (int)strlen(buf); 01308 flen = (int)strlen(frm); 01309 tlen = (int)strlen(tos); 01310 01311 i = j = 0; 01312 while (i<slen && j<len) { 01313 if (!strncmp((const char*)(buf+i), frm, flen)){ 01314 for (k=0; k<tlen; k++) { 01315 wrk[j+k] = tos[k]; 01316 } 01317 i += flen; 01318 j += tlen; 01319 } 01320 else { 01321 wrk[j++] = buf[i++]; 01322 } 01323 } 01324 01325 // 01326 if (j>=len) { 01327 free(wrk); 01328 return NULL; 01329 } 01330 01331 wrk[j] = '\0'; 01332 for (k=0; k<=j; k++) buf[k] = wrk[k]; 01333 free(wrk); 01334 01335 return buf; 01336 }
void reverse_str | ( | uByte * | p, | |
int | s | |||
) |
void reverse_str(uByte* p, int s)
バイト列を逆順にする.
[in,out] | p | バイトデータへのポインタ. |
s | バイトデータの長さ. |
Definition at line 1935 of file tools.c.
Referenced by double_from_big_endian(), double_from_little_endian(), float_from_big_endian(), float_from_little_endian(), int_from_big_endian(), int_from_little_endian(), short_from_big_endian(), short_from_little_endian(), swap_byte(), uint_from_big_endian(), uint_from_little_endian(), ushort_from_big_endian(), and ushort_from_little_endian().
01936 { 01937 int i; 01938 uByte c; 01939 01940 if (s<=0) s = (int)strlen((const char*)p); 01941 01942 for (i=0; i<s/2; i++) { 01943 c = p[s-1-i]; 01944 p[s-1-i] = p[i]; 01945 p[i] = c; 01946 } 01947 }
int seek_ringBuffer | ( | ringBuffer * | rb, | |
int | sz | |||
) |
int seek_ringBuffer(ringBuffer* rb, int sz)
リングバッファ rb の読み取り開始ポインタ spoint を sz 移動させる.
rb | リングバッファへのポインタ | |
sz | 開始ポインタを移動させる量.負数(バック)も可. |
Definition at line 3397 of file tools.c.
References ringBuffer::buf, ringBuffer::bufsz, ringBuffer::datasz, FALSE, ringBuffer::spoint, and TRUE.
03398 { 03399 if (rb==NULL) return FALSE; 03400 if (rb->buf==NULL) return FALSE; 03401 if (sz>rb->datasz) return FALSE; 03402 03403 if (rb->spoint+sz>=rb->bufsz) { 03404 rb->spoint = rb->spoint + sz - rb->bufsz; 03405 } 03406 else if (rb->spoint+sz<0) { 03407 rb->spoint = rb->bufsz + rb->spoint + sz; 03408 } 03409 else { 03410 rb->spoint = rb->spoint + sz; 03411 } 03412 03413 rb->datasz -= sz; 03414 return TRUE; 03415 }
void set_sigsegv_handler | ( | void(*)(int) | handler | ) |
void set_sigsegv_handler(void (*handler)(int))
セグメンテーションエラー時のハンドラを設定.
引数に NULLを指定した場合は,ハンドラ関数として trap_segmentation_falt() を使用.
(*handler)() | セグメンテーションエラー時に呼び出される関数へのポインタ |
Definition at line 3797 of file tools.c.
References trap_segmentation_falt().
03798 { 03799 struct sigaction sa; 03800 03801 memset(&sa, 0, sizeof(sa)); 03802 if (handler!=NULL) sa.sa_handler = handler; 03803 else sa.sa_handler = trap_segmentation_falt; 03804 03805 sa.sa_flags = 0; 03806 sigemptyset(&sa.sa_mask); 03807 sigaction(SIGSEGV, &sa, NULL); 03808 }
void set_sigterm_child | ( | void(*)(int) | handler | ) |
void set_sigterm_child(void (*handler)(int))
child プロセス終了時の処理を設定.
(*handler)() | チャイルドプロセス終了時に呼び出される関数へのポインタ@ NULL の場合は void sigterm_child(int signal) が設定される. |
Definition at line 3729 of file tools.c.
References sigterm_child().
03730 { 03731 struct sigaction sa; 03732 03733 memset(&sa, 0, sizeof(sa)); 03734 if (handler!=NULL) sa.sa_handler = handler; 03735 else sa.sa_handler = sigterm_child; 03736 03737 sa.sa_flags = SA_NOCLDSTOP | SA_RESTART; 03738 sigemptyset(&sa.sa_mask); 03739 sigaddset(&sa.sa_mask, SIGINT); // SIGCHLD 処理中は SIGINT をブロック 03740 sigaddset(&sa.sa_mask, SIGHUP); // SIGCHLD 処理中は SIGHUP をブロック 03741 sigaddset(&sa.sa_mask, SIGTERM); // SIGCHLD 処理中は SIGTERM をブロック 03742 sigaction(SIGCHLD, &sa, NULL); 03743 }
short short_from_big_endian | ( | void * | ptr | ) |
short short_from_big_endian(void* ptr)
Big Endian形式で格納されている short int型の値を取り出す.
ptr | 変数が格納されているメモリへのポインタ |
Definition at line 350 of file tools.c.
References check_endian(), HostEndian, LITTLE_ENDIAN, reverse_str(), and UNKNOWN_ENDIAN.
00351 { 00352 short ret = *((short*)ptr); 00353 00354 if (HostEndian==UNKNOWN_ENDIAN) check_endian(); 00355 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 2); 00356 return ret; 00357 }
short short_from_little_endian | ( | void * | ptr | ) |
short short_from_little_endian(void* ptr)
Little Endian形式で格納されている short int型の値を取り出す.
ptr | 変数が格納されているメモリへのポインタ |
Definition at line 236 of file tools.c.
References BIG_ENDIAN, check_endian(), HostEndian, reverse_str(), and UNKNOWN_ENDIAN.
00237 { 00238 short ret = *((short*)ptr); 00239 00240 if (HostEndian==UNKNOWN_ENDIAN) check_endian(); 00241 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 2); 00242 return ret; 00243 }
void sigterm_child | ( | int | signal | ) |
void sigterm_child(int signal)
child プロセス終了時の処理
signal | ハンドラのシグナル番号.システムによって設定される. |
Definition at line 3754 of file tools.c.
References UNUSED.
Referenced by set_sigterm_child().
03755 { 03756 UNUSED(signal); 03757 03758 pid_t pid = 0; 03759 int ret; 03760 03761 //DEBUG_MODE PRINT_MESG("%d is waiting for children. signal = %d\n", getpid(), signal); 03762 //signal = 0; // dummy for warning of compiler 03763 03764 do { // チャイルドプロセスの終了を待つ 03765 pid = waitpid(-1, &ret, WNOHANG); 03766 } while(pid>0); 03767 }
void sjis2euc | ( | unsigned char * | c1, | |
unsigned char * | c2 | |||
) |
void sjis2euc(unsigned char *c1, unsigned char *c2)
漢字コード変換.SJIS → EUC
[in,out] | c1 | 変換する文字の第一バイト.内容が書き換えられる. |
[in,out] | c2 | 変換する文字の第二バイト.内容が書き換えられる. |
Definition at line 2674 of file tools.c.
Referenced by kanji_convert_sjis2euc().
02675 { 02676 if (*c2<0x9f) { 02677 if (*c1 < 0xa0) { 02678 *c1 -= 0x81; 02679 *c1 *= 2; 02680 *c1 += 0xa1; 02681 } 02682 02683 else { 02684 *c1 -= 0xe0; 02685 *c1 *= 2; 02686 *c1 += 0xdf; 02687 } 02688 if (*c2>0x7f) (*c2)--; 02689 *c2 += 0x61; 02690 } 02691 else { 02692 if (*c1<0xa0) { 02693 *c1 -= 0x81; 02694 *c1 *= 2; 02695 *c1 += 0xa2; 02696 } 02697 else { 02698 *c1 -= 0xe0; 02699 *c1 *= 2; 02700 *c1 += 0xe0; 02701 } 02702 *c2 += 2; 02703 } 02704 }
char* skip_char | ( | char * | pp, | |
char | cc | |||
) |
char* skip_char(char* pp, char cc)
文字列 pp の中で,次の cc までポインタをスキップさせる.
ただし," ", ' ' 内に該当文字があった場合,それらは無視される.
pp | 文字列の先頭ポインタ | |
cc | スキップする文字を格納した文字列. |
Definition at line 1019 of file tools.c.
01020 { 01021 int sqf = 0, dqf = 0; 01022 01023 while (*pp!='\0') { 01024 while (*pp=='\\') pp += 2; 01025 // 01026 if (*pp!='\0') { 01027 if (!sqf && *pp=='\"') dqf = 1 - dqf; 01028 else if (!dqf && *pp=='\'') sqf = 1 - sqf; 01029 else if (!sqf && !dqf && *pp==cc) return pp; 01030 pp++; 01031 } 01032 } 01033 01034 return pp; 01035 }
char* skip_char_pair | ( | char * | pp, | |
char | pair, | |||
char | end | |||
) |
char* skip_char_pair(char* pp, char pair, char end)
pair から始まって end で閉じるまで,ポインタをスキップさせる.ただし " " と ' ' 内は完全スキップ
pair と end は対になっている必要がある.
pp は pair の位置を指しているのが望ましい.指していなくても動くけど....
ペアの end がない場合は '\0' へのポインタを返す.
pp | 操作対象の文字列 | |
pair | ペアとなる最初の文字 | |
end | ペアとなる最後の文字 |
pt = skip_char_pair(pp, '<', '>');
Definition at line 1057 of file tools.c.
Referenced by json_array_parse(), and json_parse_prop().
01058 { 01059 int cnt = 0, sqf = 0, dqf = 0; 01060 01061 if (*pp==pair) { 01062 cnt = 1; 01063 pp++; 01064 } 01065 01066 while (*pp!='\0') { 01067 while (*pp=='\\') pp += 2; 01068 // 01069 if (*pp!='\0') { 01070 if (!sqf && *pp=='\"') dqf = 1 - dqf; 01071 else if (!dqf && *pp=='\'') sqf = 1 - sqf; 01072 01073 else if (!sqf && !dqf) { 01074 if (*pp==end) cnt--; 01075 else if (*pp==pair) cnt++; 01076 if (cnt==0) return pp; 01077 } 01078 pp++; 01079 } 01080 } 01081 01082 return pp; 01083 }
char* skip_chars | ( | char * | pp, | |
const char * | check | |||
) |
char* skip_chars(char* pp, const char* check)
ppの指す文字列中で,check[]に格納されたいずれかの文字までポインタをスキップさせる.
ただし," ", ' ' 内に該当文字があった場合,それらは無視される.
pp | 文字列の先頭ポインタ | |
check | スキップする文字を格納した文字列. |
Definition at line 981 of file tools.c.
Referenced by json_array_parse(), xml_parse_comment_node(), xml_parse_data_node(), xml_parse_end_node(), xml_parse_processing_node(), and xml_parse_start_node().
00982 { 00983 int n, sqf = 0, dqf = 0; 00984 00985 n = (int)strlen(check); 00986 00987 while (*pp!='\0') { 00988 while (*pp=='\\') pp += 2; 00989 // 00990 if (*pp!='\0') { 00991 if (!sqf && *pp=='\"') dqf = 1 - dqf; 00992 else if (!dqf && *pp=='\'') sqf = 1 - sqf; 00993 00994 else if (!sqf && !dqf) { 00995 int i; 00996 for (i=0; i<n; i++) { 00997 if (*pp==check[i]) return pp; 00998 } 00999 } 01000 pp++; 01001 } 01002 } 01003 01004 return NULL; 01005 }
char* skip_string_end | ( | char * | pp | ) |
char* skip_string_end(char* pp)
文字列の最後までポインタをスキップする.
ppの指す文字列 "〜" または '〜' の最後の クォーテーションへのポインタ
pp | 文字列の先頭の クォーテーションへのポインタ |
Definition at line 1096 of file tools.c.
Referenced by json_parse_prop().
01097 { 01098 char ch = *pp; 01099 01100 if (*pp=='\"' || *pp=='\'') { 01101 pp++; 01102 // 01103 while (*pp!='\0') { 01104 while (*pp=='\\') pp += 2; 01105 // 01106 if (*pp!='\0') { 01107 if (*pp==ch) return pp; 01108 } 01109 pp++; 01110 } 01111 } 01112 return pp; 01113 }
int strncaservscmp | ( | const char * | s1, | |
const char * | s2, | |||
int | n | |||
) |
int strncaservscmp(const char* s1, const char* s2, int n)
文字列 s1と s2を後ろから n文字比較する.
0 | 一致する | |
1 | 一致しない |
Definition at line 729 of file tools.c.
Referenced by ex_strncaservscmp().
00730 { 00731 int j1, j2; 00732 00733 if (s1==NULL || s2==NULL) return 1; 00734 00735 j1 = (int)strlen(s1) - 1; 00736 j2 = (int)strlen(s2) - 1; 00737 00738 while (n>0 && j1>=0 && j2>=0) { 00739 if (toupper(s1[j1--]) != toupper(s2[j2--])) return 1; 00740 n--; 00741 } 00742 00743 if (n==0) return 0; 00744 else return 1; 00745 }
int strnrvscmp | ( | const char * | s1, | |
const char * | s2, | |||
int | n | |||
) |
int strnrvscmp(const char* s1, const char* s2, int n)
文字列 s1と s2を後ろから n文字比較する.
0 | 一致する | |
1 | 一致しない |
Definition at line 699 of file tools.c.
Referenced by ex_strnrvscmp(), is_host_in_list(), and recv_mesg_until_end().
00700 { 00701 int j1, j2; 00702 00703 if (s1==NULL || s2==NULL) return 1; 00704 00705 j1 = (int)strlen(s1) - 1; 00706 j2 = (int)strlen(s2) - 1; 00707 00708 while (n>0 && j1>=0 && j2>=0) { 00709 if (s1[j1--] != s2[j2--]) return 1; 00710 n--; 00711 } 00712 00713 if (n==0) return 0; 00714 else return 1; 00715 }
char* strstrcase | ( | const char * | buf, | |
const char * | nd | |||
) |
char* strstrcase(const char* buf, const char* nd)
文字列 bufの中に部分文字列 ndがあるかどうかをチェックする.大文字小文字を区別しない.
大文字小文字を区別しない点を除けば,strstr() と同じ.
つまり strcasestr() と同じ.標準で strcasestr()が存在しない場合に使用.
buf | 検索対象の文字列 | |
nd | 検索する部分文字列 |
Definition at line 763 of file tools.c.
References upper_string().
Referenced by get_mime_enckind(), get_mime_filename(), get_sip_via_address(), insert_sip_record_route(), replace_sip_contact(), search_protocol_header_partvalue(), strstrcase_back_tList(), and strstrcase_tList().
00764 { 00765 char* pp; 00766 char* pb; 00767 char* pn; 00768 00769 if (buf==NULL || nd==NULL) return NULL; 00770 00771 pb = (char*)malloc(strlen(buf)+1); 00772 if (pb==NULL) return NULL; 00773 memcpy(pb, buf, (int)strlen(buf)+1); 00774 00775 pn = (char*)malloc(strlen(nd)+1); 00776 if (pn==NULL) { 00777 free(pb); 00778 return NULL; 00779 } 00780 memcpy(pn, nd, (int)strlen(nd)+1); 00781 00782 upper_string(pb); 00783 upper_string(pn); 00784 00785 pp = strstr(pb, pn); 00786 if (pp!=NULL) { 00787 pp = (pp - pb) + (char*)buf; 00788 } 00789 free(pb); 00790 free(pn); 00791 00792 return pp; 00793 }
void swap_byte | ( | void * | p, | |
int | s, | |||
int | c | |||
) |
void swap_byte(void* p, int s, int c)
上位バイトと下位バイトを逆順にする.
pが指す長さ sのデータを cバイトづつ逆順にする.
[in,out] | p | データへのポインタ. |
s | データの長さ.バイト単位. | |
c | 逆順にするデータの長さ.バイト単位. |
Definition at line 1866 of file tools.c.
References reverse_str().
01867 { 01868 int i; 01869 uByte* u = (uByte*)p; 01870 for (i=0; i<s; i+=c) reverse_str(&u[i], c); 01871 }
int swapl | ( | unsigned int | p | ) |
int型 32bit pを8bitづつ逆順にする
ntohl(), htonl()の代替関数.Windows用.
p | 入れ替える値 |
Definition at line 1909 of file tools.c.
Referenced by get_tiff_ifd(), and get_tiff_uint_field().
01910 { 01911 int r; 01912 uByte* t; 01913 uByte* f; 01914 01915 t = (uByte*)&r; 01916 f = (uByte*)&p; 01917 t[0] = f[3]; 01918 t[1] = f[2]; 01919 t[2] = f[1]; 01920 t[3] = f[0]; 01921 01922 return r; 01923 }
short swaps | ( | unsigned short | p | ) |
short swaps(unsigned short p)
short型(16bit)pの上下8bitを入れ替える. ntohs(), htons()の代替関数.Windows用.
p | 入れ替える値 |
Definition at line 1884 of file tools.c.
Referenced by get_tiff_ifd(), get_tiff_uint_field(), and read_user_data().
01885 { 01886 short r; 01887 uByte* t; 01888 uByte* f; 01889 01890 t = (uByte*)&r; 01891 f = (uByte*)&p; 01892 t[0] = f[1]; 01893 t[1] = f[0]; 01894 01895 return r; 01896 }
char* temp_filename | ( | const char * | dir, | |
int | flen | |||
) |
char* temp_filename(const char* dir, int flen)
/dev/urandom を利用して作業用ファイルのランダムなファイル名を得る.
/dev/urandom が読めない場合は randstr() を利用する. 返されたデータは free()する必要がある.
dir | 作業ファイルを作るディレクトリ | |
flen | 生成するファイル名の長さ |
Definition at line 2396 of file tools.c.
References encode_base64(), file_exist(), randstr(), and UNUSED.
Referenced by gz_decode_file_replace(), save_http_xml(), and save_https_xml().
02397 { 02398 FILE* fp; 02399 int i, dlen=0; 02400 char nostr = '\0'; 02401 char* fname; 02402 char* fnbin; 02403 char* fnb64; 02404 size_t rs; 02405 UNUSED(rs); 02406 02407 if (dir==NULL) dir = &nostr; 02408 dlen = (int)strlen(dir); 02409 if (flen<=0) flen = 15; 02410 02411 fname = (char*)malloc(dlen+flen+1); 02412 if (fname==NULL) return NULL; 02413 fnbin = (char*)malloc(flen); 02414 if (fnbin==NULL) { 02415 free(fname); 02416 return NULL; 02417 } 02418 02419 fnb64 = NULL; 02420 fp = fopen("/dev/urandom", "rb"); 02421 02422 do { 02423 if (fp!=NULL) { 02424 rs = fread(fnbin, flen, 1, fp); 02425 fnb64 = (char*)encode_base64((unsigned char*)fnbin, flen); 02426 if (fnb64!=NULL) fnb64[flen] = '\0'; 02427 } 02428 if (fnb64==NULL) fnb64 = randstr(flen); 02429 02430 for (i=0; i<flen; i++) { 02431 if (fnb64[i]=='/') fnb64[i] = 'x'; 02432 if (fnb64[i]=='+') fnb64[i] = 'X'; 02433 } 02434 02435 memset (fname, 0, dlen+flen+1); 02436 strncpy(fname, dir, dlen); 02437 strncat(fname, fnb64, flen); 02438 free(fnb64); 02439 } while(file_exist(fname)); 02440 02441 if (fp!=NULL) fclose(fp); 02442 free(fnbin); 02443 return fname; 02444 }
void trap_segmentation_falt | ( | int | signal | ) |
void trap_segmentation_falt(int signal)
セグメンテーションエラー時にデフォルトで呼び出される関数.
signal | ハンドラのシグナル番号.システムによって設定される. |
Definition at line 3819 of file tools.c.
References PRINT_MESG.
Referenced by set_sigsegv_handler().
03820 { 03821 PRINT_MESG("****************************************************************\n"); 03822 PRINT_MESG("* Segmentation Falt in [%d] !!!!!\n", getpid()); 03823 PRINT_MESG("****************************************************************\n"); 03824 03825 exit(signal); 03826 }
unsigned int uint_from_big_endian | ( | void * | ptr | ) |
unsigned int uint_from_big_endian(void* ptr)
Big Endian形式で格納されている unsigned int型の値を取り出す.
ptr | 変数が格納されているメモリへのポインタ |
Definition at line 331 of file tools.c.
References check_endian(), HostEndian, LITTLE_ENDIAN, reverse_str(), and UNKNOWN_ENDIAN.
00332 { 00333 int ret = *((unsigned int*)ptr); 00334 00335 if (HostEndian==UNKNOWN_ENDIAN) check_endian(); 00336 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 4); 00337 return ret; 00338 }
unsigned int uint_from_little_endian | ( | void * | ptr | ) |
unsigned int uint_from_little_endian(void* ptr)
Little Endian形式で格納されている unsigned int型の値を取り出す.
ptr | 変数が格納されているメモリへのポインタ |
Definition at line 217 of file tools.c.
References BIG_ENDIAN, check_endian(), HostEndian, reverse_str(), and UNKNOWN_ENDIAN.
00218 { 00219 unsigned int ret = *((unsigned int*)ptr); 00220 00221 if (HostEndian==UNKNOWN_ENDIAN) check_endian(); 00222 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 4); 00223 return ret; 00224 }
char* ulltostr | ( | unsigned long long int | n | ) |
char* ulltostr(unsigned long long int n)
unsigned long long int型 nを文字列にして返す.
n | 文字列に変換する値 |
char* ulltostr_ts | ( | unsigned long long int | n | ) |
char* ulltostr_ts(unsigned long long int n)
unsigned long long int型 nを文字列にして返す. Thread Safe
n | 文字列に変換する値 |
Definition at line 1616 of file tools.c.
References LDATA.
Referenced by llsd_bin_main_parse().
01617 { 01618 char* str = NULL; 01619 str = (char*)malloc(LDATA); 01620 if (str==NULL) return NULL; 01621 01622 memset(str, 0, LDATA); 01623 snprintf(str, LDATA-1, "%llu", n); 01624 return str; 01625 }
char* ultostr | ( | unsigned long int | n | ) |
char* ultostr(unsigned long int n)
unsigned long int型 nを文字列にして返す.
n | 文字列に変換する値 |
char* ultostr_ts | ( | unsigned long int | n | ) |
char* ultostr_ts(unsigned long int n)
unsigned long int型 nを文字列にして返す.Thread Safe
n | 文字列に変換する値 |
Definition at line 1574 of file tools.c.
References LDATA.
void upper_string | ( | char * | str | ) |
str中の小文字を大文字に変換する
[in,out] | str | 変換する文字列へのポインタ.内容が書き換えられる. |
Definition at line 2715 of file tools.c.
Referenced by strstrcase().
02716 { 02717 int i; 02718 for (i=0; i<(int)strlen((const char*)str); i++) { 02719 if (str[i]>='a' && str[i]<='z') str[i] += 'A' - 'a'; 02720 } 02721 }
unsigned short ushort_from_big_endian | ( | void * | ptr | ) |
unsigned short ushort_from_big_endian(void* ptr)
Big Endian形式で格納されている unsigned short int型の値を取り出す.
ptr | 変数が格納されているメモリへのポインタ |
Definition at line 369 of file tools.c.
References check_endian(), HostEndian, LITTLE_ENDIAN, reverse_str(), and UNKNOWN_ENDIAN.
00370 { 00371 unsigned short ret = *((unsigned short*)ptr); 00372 00373 if (HostEndian==UNKNOWN_ENDIAN) check_endian(); 00374 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 2); 00375 return ret; 00376 }
unsigned short ushort_from_little_endian | ( | void * | ptr | ) |
unsigned short ushort_from_little_endian(void* ptr)
Little Endian形式で格納されている unsigned short int型の値を取り出す.
ptr | 変数が格納されているメモリへのポインタ |
Definition at line 255 of file tools.c.
References BIG_ENDIAN, check_endian(), HostEndian, reverse_str(), and UNKNOWN_ENDIAN.
00256 { 00257 unsigned short ret = *((unsigned short*)ptr); 00258 00259 if (HostEndian==UNKNOWN_ENDIAN) check_endian(); 00260 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 2); 00261 return ret; 00262 }
unsigned char* uuid2guid | ( | unsigned char * | p | ) |
unsigned char* uuid2guid(unsigned char* p)
バイナリの UUID を テキストのGUIDに変換する.要 free()
p | バイナリの UUID. 128bit |
Definition at line 3607 of file tools.c.
References LGUID.
Referenced by llsd_bin_main_parse().
03608 { 03609 unsigned char* guid; 03610 03611 if (p==NULL) return NULL; 03612 03613 guid = (unsigned char*)malloc(LGUID); // 40 = 32+4+1(\0) + α 03614 if (guid==NULL) return NULL; 03615 03616 snprintf((char*)guid, 37, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", 03617 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]); 03618 03619 return guid; 03620 }
long int write_file | ( | const char * | fname, | |
unsigned char * | buf, | |||
unsigned long int | size | |||
) |
long int write_file(const char* fname, unsigned char* buf, unsigned long int size)
ファイルにデータを書き込む
fname | ファイル名. | |
buf | 書き込むデータへのポインタ. | |
size | 読み込んだデータのサイズを返す. |
char _ToSTR[LDATA] [static] |
int DebugMode = OFF |
Definition at line 18 of file tools.c.
Referenced by disp_img(), and write_img().
FILE* FP_ErrFile = NULL |
FILE* FP_LogFile = NULL |
int HostEndian = UNKNOWN_ENDIAN |
ホストの Endian
Definition at line 22 of file tools.c.
Referenced by check_endian(), double_from_big_endian(), double_from_little_endian(), float_from_big_endian(), float_from_little_endian(), int_from_big_endian(), int_from_little_endian(), is_big_endian(), is_little_endian(), short_from_big_endian(), short_from_little_endian(), uint_from_big_endian(), uint_from_little_endian(), ushort_from_big_endian(), and ushort_from_little_endian().
int KanjiCode = CODE_UTF8 |
処理用漢字コード.CODE_US, CODE_SJIS, CODE_EDUがある.デフォルトは CODE_US.
Definition at line 21 of file tools.c.
Referenced by kanji_convert(), and kanji_convert_Buffer().
unsigned char LocalIPNum[4] = {0x7f, 0x00, 0x00, 0x01} |
unsigned char LocalIPNum6[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01} |
int UnitTestMode = OFF |