2 * 以下関数群は動的なメモリーの割り当てを前提にした、c言語のための標準的文字列操作の関数です。
3 * 私が自分のプログラミングの為に書きました。
4 * どなたでもご利用になれますし、書き換えも構いません。
5 * この関数は私 Masashi Shimakuraが20051123に書きました、現在でもメンテナンスを行ってます。
6 * 何かお気づきの点がありましたら以下にご連絡ください。
7 * インストールされる場合は同封のINSTALL.utfjpファイルを確認してください。
8 * 具体的な書き方はlibmstestのソースであるtest.cを確認する方法もあります。
10 * mail: masashi@ms-n.com
15 このFILEは libms.so ライブラリに含まれる以下の関数の使いかたを説明しています。
18 SAFE_FPCAT() ファイルポインターから一行読み込む
19 SAFE_FDCPM() ファイルディスクリプターから一行読み込む
20 SAFE_FDCAT() ファイルディスクリプターから改行まで読み込む
21 SAFE_FILEFDCAT() ファイルディスクリプターからストリーム終端まで読み込む
22 SAFE_MEMCPY() バッファーに任意のサイズの文字列をコピーする
23 SAFE_STRNCAT() 既に使われているバッファーの後ろに文字列を追加する
24 SAFE_SPRINTF() フォーマット文字列をバッファーにコピーする
25 DELIM_GET() デリミターで区切られたデータの指定番めを取り出す
26 DELIM_F() デリミターで区切られた文字列の先頭からX個分をコピーする
27 DELIM_R() デリミターで区切られた文字列のX個目から後ろをコピーする
28 ALGET_READ() fdから得たデータをネゴしながら行単位で受け取りファイルに書き出す関数。
29 ALGET_WRITE() FPから一行ずつ読み出したデータをネゴしながら一定量小分けでsendする関数
30 SWAP_RN() 文字列全体の中のすべての指定文字を、(\r\n)の改行に置き換える。
31 NULL_FREE() バッファーの使用された大きさ分だけNULLで埋める。
34 SELF_MEMCPY() 指定サイズを越えないメモリーコピー
35 SELF_STRNCAT() 指定サイズを越えないでバッファーの後端に文字列を追加する
36 SELF_MEMCMP() お互いの大きさも考慮した文字列の比較
37 SELF_DELIM_GET() デリミターで区切られたデータの指定番めを取り出す、動的なバッファーを使わない
40 SOCKET_READS() ファイルディスクリプタから動的なバッファに読み込む
41 SOCKET_READA() ファイルディスクリプタから動的なバッファに読み込む
42 SOCKET_READAS() ファイルディスクリプタから動的なバッファに読み込む (select付き)
43 SOCKET_READASTH() ファイルディスクリプタから動的なバッファに読み込む (readのtimeoutあり)
44 SOCKET_SENDS() ファイルディスクリプタに書き込む 1 (select)
45 SOCKET_SEND() ファイルディスクリプタに書き込む 2
46 SELECT_FDCAT() ファイルディスクリプタから読み込む
50 UNLINKDIR() ディレクトリー内のファイルの一括削除
55 CH_INT() 文字列が数字か+,-で構成されていることを確認
56 CH_INT2() 文字列が数字で構成されていることを確認
57 CH_FLOAT() 文字列が数字と'.'で構成されていることを確認
58 CH_INT3() 文字列が数字か任意の文字一つで構成されていることを確認
59 CH_INT4() 文字列が数字と任意の文字一つで構成されていることを確認
60 CH_INT_V6() dataがIPV6アドレスを構成する文字であることを確認
61 CH_INT_V4() dataがIPV4アドレスを構成する文字であることを確認
62 CH_CHAR() 文字列が数字かASCII文字であることを確認し、バッファーにコピーする。
63 CHAR_COUNT() 文字列に検索するキャラクタが幾つ含まれるか数える
64 CHAR_GET() 文字列をデリミターで区切り、指定番めの文字列をバッファに入れる。
65 CHAR_POINT() 文字列の中で指定文字が指定番めに表れる先頭からの位置を返す。
66 CLEAN_MEM() 文字列を指定した文字で全て書き換える。
67 COUNT_MEMCPY() 文字列の先頭から指定した数だけバッファにコピーする
68 COUNT_MEMCPY2() 文字列の指定位置から指定した数だけバッファにコピーする
69 DELIM_COUNT() 文字列をデリミターで区切り、指定番めの文字列の先頭位置と終端位置を返す
70 MEM_COUNT() 文字列に指定文字が最後に表れる場所(番め)を返す。
71 MEM_TCOUNT() 文字列に指定文字が最初に表れる場所(番め)を返す。
72 MEMCOUNT_CPM() 文字列の指定位置を別バッファにコピーする
73 RM_CRLF() 文字列の中の\r\nを0x00に置き換える
74 RM_CHAR() 文字列の中の特定の文字を消して、お尻をつめる。
75 SET_MEM() 文字列の中の特定の文字を0x00に置き換える
76 SWAP_MEM() 特定の文字を特定の文字で置き換える
77 SWAP_ARMEM() 特定の範囲の特定の文字を特定の文字で置き換える
78 CHMEM() とにかく指定した数だけ0x00でうめる。
82 BASE64() 文字列をbase64エンコードする。
83 UJTOJ() EUC文字列をJISに変更する。
84 SAFE_BASE64() 文字列をbase64エンコードする。(動的バッファ)
85 SAFE_UJTOJ() EUC文字列をJISに変更する。(動的バッファ)
86 MIME_UJTOJ() EUC文字列をJISに変換しながら、76文字で折り返しMIMEに従ったsubject文字に変更する。(動的バッファ)
87 RANDDATA() 指定した数字の幅の中から、マイクロ秒をseedとして生成した乱数を返す。
88 COUNTS() 指定した幅の数を少ない方から順番に返す。
89 IN_BIT() '0101'で表現された文字列(2進数)を整数に変換する。
90 OUT_BIT() 整数を'01010'で表現される文字列(2進数)に変換する。
91 SHIFT8_UPDOWN_IN() 32Bit整数を8Bitで4っに分けてそれぞれに8Bitで表現可能な数を入れる
92 SHIFT8_UPDOWN_OUT() 32Bit整数を8Bitで4っに分けて、それぞれの値を別に取り出す。
93 INITDAEMON() 指定したコマンドを子プロセスにして、バックグランドに落す
94 INITDAEMONS() 自らのプロセスをバックグラウンドに落す
95 CONVERT() バッファーの文字列を、指定した文字コードから指定した文字コードに変換する。
96 SELF_CONVERT_DATA() バッファーの文字列を、指定した文字コードから指定した文字コードに変換する。文字数の制限つき。普通のバッファー用
97 SAFE_CONVERT_DATA() バッファーの文字列を、指定した文字コードから指定した文字コードに変換する。(動的バッファー)
102 CHAR_WDAY() 0から6の数字から3文字の曜日を示す文字列をかえす。
103 CHAR_MON() 0から11の数字から3文字の月を示す文字列をかえす。
104 UTIME_GETR() unix time からcharで指定した時間をかえす
105 CTIME_GETR() 現在時刻の指定文字の示す時間属性をかえす
106 TIME_MINUS() cha 単位で t 時 から mt 時間引いた時間を返す関数 0 - 1 = 23
107 TIME_PLAS() cha 単位で t 時 に mt 時間プラスした時間を返す関数 23 + 2 = 1
108 DAY_PLASMINUS() 一日前後の日、月、年を出す
109 GET_UNIXTIME() localな時間からUNIX時間をかえす。
110 DAY_MINUS() 現在の年月で、一日前の日をかえす。(1 - 1 = 31)
111 MONTH_LAST() 何年何月の最後の日を出す
112 MONTH_MINUS() 指定月から一ヶ月引いた月をかえす。単純。。
113 TIME_GETR() 現在時刻の:区切りの文字列をバッファにかえす。
122 ----- 以下は動的アロケーション関数リファレンス -----
128 SAFE_FPCAT() ファイルポインターから一行読み込む
131 char * safe_fpcat(FILE *(1), char *(2), int *(3), int(4));
133 (2) char * すでにmalloc()で確保されたバッファーを指定(通常戻り値も同じになる)
134 (3) 終了ステータス(int ポインター) 、異常は(-1)を返す。
137 使用例 > data = safe_fpcat(fp, data, &stat, MAX_LEN);
140 ファイルポインターから一行バッファーに読み込み終了する関数。(動的バッファー)
141 得られるバッファーの後端に改行を含まない。
142 バッファーのアドレスは変化するので戻り値(char *)を信用すること、通常の使用では(2)
146 動的にサイズを調整(mallc)したバッファのアドレスを返す。失敗した場合はNULLを返す。
153 SAFE_FDCPM() ファイルディスクリプターから一行読み込む
156 char * safe_fdcpm(int(1), char *(2), int *stat(3), int(4));
158 (2) char * すでにmalloc()で確保されたバッファーを指定(通常戻り値も同じになる)
159 (3) 終了ステータス(intポインター) 、異常は(-1)を返す。
162 使用例 > data = safe_fdcpm(fd, data, &stat, MAX_LEN);
165 ファイルディスクプリターから改行まで読み込み終了する関数。(動的バッファー)
167 但し閾値を超えた場合はバッファーの後端に改行を含まないので、含まない場合はエラー
168 とするか再度読むように使うこと。 バッファーのアドレスは変化するので戻り値(char *)
169 を信用すること、通常の使用では(2)と戻り値の変数は同じになる。
172 動的にサイズを調整(mallc)したバッファのアドレスを返す。失敗した場合はNULLを返す。
180 SAFE_FDCAT() ファイルディスクリプターから改行まで読み込む
183 char * safe_fdcat(int(1), char *(2), int *stat(3), int(4), int(5));
185 (2) char * すでにmalloc()で確保されたバッファーを指定(通常戻り値も同じになる)
186 (3) 終了ステータス(ポインター) 、異常は(-1)を返す。
187 (4) int 確保するバッファーの上限。
188 (5) int select()にてタイムアウトを見る際の時間(sec)
190 使用例 > data = safe_fdcat(fd, data, &stat, MAX_LEN, time);
193 ファイルディスクプリターから改行まで読み込み終了する関数。(動的バッファー)
194 得られるバッファーの後端に改行を含む。 但し閾値を超えた場合は改行のみを書き込
195 む。この場合得られるデータは改行のみとなる。問題のおきた場合のステータスは常に
196 -1 で、正常な場合は得たバイト数を返す。0の場合は正常である。
199 動的にサイズを調整(mallc)したバッファのアドレスを返す。失敗した場合はNULLを返す。
207 SAFE_FILEFDCAT() ファイルディスクリプターからストリーム終端まで読み込む
210 char * safe_filefdcat(int(1), char *(2), int *stat(3), int(4), int(5));
212 (2) char * すでにmalloc()で確保されたバッファーを指定(通常戻り値も同じになる)
213 (3) 終了ステータス(ポインター) 、異常は(-1)を返す。
214 (4) int 確保するバッファーの上限。
215 (5) int select()にてタイムアウトを見る際の時間(sec)
217 使用例 > data = safe_filefdcat(fd, data, indata, &stat, MAX_LEN);
220 ファイルディスクプリターからストリームの終端まで読み込み終了する関数。(動的バッファー)
221 得られるバッファーの後端に改行を含む。 但し閾値を超えた場合はバッファーの後端に改行を
222 書き込み、それ以後改行が読まれるまでfdを空読みする。 EOF(End of file)が読まれるまで
223 ループを抜けない点に注意。 バッファーのアドレスは変化するので戻り値(char *)を信用する
224 こと、通常の使用では(2)と戻り値の変数は同じになる。
227 動的にサイズを調整(mallc)したバッファのアドレスを返す。失敗した場合はNULLを返す。
234 SAFE_MEMCPY() バッファーに任意のサイズの文字列をコピーする
237 char * safe_memcpy(char *(1), char *(2), int(3));
238 (1) char * char * すでにmalloc()で確保されたバッファーを指定(通常戻り値も同じになる)
239 (2) char * 読み込むバッファー。
242 使用例 > data = safe_memcpy(data, indata, MAX_LEN);
245 バッファーからバッファーにデータをコピーする関数。(動的バッファー)
248 動的にサイズを調整(mallc)したバッファのアドレスを返す。失敗した場合はNULLを返す。
256 SAFE_STRNCAT() 既に使われているバッファーの後ろに文字列を追加する
259 char * safe_strncat(char *(1), char *(2), int(3));
260 (1) char * すでにmalloc()で確保されたバッファーを指定(通常戻り値も同じになる)
261 (2) char * 読み込むバッファー。
264 使用例 > data = safe_strncat(data, indata, MAX_LEN);
267 すでにあるバッファーの大きさを変更して、すでに入っているデータの後ろにデータを追加
271 動的にサイズを調整(mallc)したバッファのアドレスを返す。失敗した場合はNULLを返す。
279 SAFE_SPRINTF() フォーマット文字列をバッファーにコピーする
282 char * safe_sprintf(char *(1), int(4), const char *(2), format, ...);
283 (1) char * すでにmalloc()で確保されたバッファーを指定(通常戻り値も同じになる)
284 (2) フォーマット文字列 " taro %d?n"
285 (3) フォーマット用変数、データ(数は10個まで)
288 使用例 > data = safe_sprintf(data, MAX_LEN, "--%d--?n", inA);
291 フォーマット文字列から指定したバッファーにデータを追加する関数。(動的バッファー)
292 読み込みバッファーを指定して書き込むことは出来ませんので注意。
295 動的にサイズを調整(mallc)したバッファのアドレスを返す。失敗した場合はNULLを返す。
303 DELIM_GET() デリミターで区切られたデータの指定番めを取り出す
306 char * delim_get(char *(1), char *(2), char(3), int *(4), int(5));
308 (2) char * 取り出したデータを入れるバファ
313 使用例 > data = delim_get(base, data, ',', %stat, 4);
316 上の使用例ではbase内をデリミタ(,)で区切った場合の4番めの文字列をdataに
317 書き込む。書き込むバッファは予めmalloc()されている必要がある。
320 失敗した場合は返却文字列に"NOT"を書き込む。
328 DELIM_F() デリミターで区切られた文字列の先頭からX個分をコピーする
331 char * delim_f(char *(1), char * (2), char(3), int(4));
333 (2) char * 取り出したデータを入れるバファ
337 使用例 > data = delim_f(base, data, ',', 4);
340 上記の例だと、base を区切る','の4個めまでの文字列をdataにコピーする。
350 DELIM_R() デリミターで区切られた文字列のX個目から後ろをコピーする
353 char * delim_r(char *(1), char * (2), char(3), int(4));
355 (2) char * 取り出したデータを入れるバファ
359 使用例 > data = delim_r(base, data, ',', 4);
362 上記の例だと、base を区切る','の4個めから後ろの文字列をdataにコピーする。
375 ----- 以下は通常関数のリファレンス -----
381 SELF_MEMCPY() 指定サイズを越えないメモリーコピー
384 int self_memcpy(char *(1), char *(2), int(3));
387 (3) int コピーする文字列の上限、普通は(1)で確保されている上限サイズ
389 使用例 > ret = self_memcpy(data, "ABCD", 128);
392 大きさが固定のバッファーに対して、安全にデータをコピーする。
402 SELF_STRNCAT() 指定サイズを越えないでバッファーの後端に文字列を追加する
405 int self_strncat(char *(1), char *(2), int(3));
408 (3) int コピーする文字列の上限、普通は(1)で確保されている上限サイズ
410 使用例 > ret = self_memcpy(data, "ABCD", 128);
413 大きさが固定のバッファーに対して、安全にデータを後端にコピーする。
423 SELF_MEMCMP() お互いの大きさも考慮した文字列の比較
426 int self_memcmp(char *(1), char *(2));
430 使用例 > ret = self_memcmp(data1, "taro");
433 文字列同士の比較だが、サイズが違う場合もエラーと判断する。
436 通常のmemcmp()と同じだが、サイズが違う場合も-1を返す。
444 ALGET_READ() fdから得たデータをネゴしながら行単位で受け取りファイルに書き出す関数。
447 char * alget_read(char *(1), int(2), int(3), int(4), int *(5), char(6), int(7), int(8));
449 (2) データを置くバファ(意味ないので、いずれなくします)
452 (5) 受け取りデータの特定の文字を置き換えます。(普通は送信時に改行を何に変えているか)
453 (6) この数字よりサイズが大きいとデータの受け取りを一時中断しますが、実際の単位は行単位です。
454 (7) mode 1 client -> server 最後にステータスを送る
455 mode 0 server -> client 受け取って終わり
458 rec = alget_read(filename, rec, sk, interval, &stat, delim, file_len, mode);
461 (2)のポインターを返すが、現状で意味がないので、いずれへんこうします。
467 ALGET_WRITE() FPから一行ずつ読み出したデータをネゴしながら一定量小分けでsendする関数
470 int alget_write(int(1), FILE *(2), int(3), char(4), int(5), int(6));
472 (2) 書き出すファイルのファイルポインター
474 (4) 送信データの特定の文字を置き換えます。(普通は送信時に改行を何に変えるか)
475 (5) この数字よりサイズが大きいとデータの受け取りを一時中断しますが、実際の単位は行単位です。
476 (6) mode 1 client -> server 最後にステータスを送る
477 mode 0 server -> client 受け取って終わり
480 ren = alget_write(int sock_fd, FILE * fp, int interval, char delim, int file_len, int mode);
489 SWAP_RN() 文字列全体の中のすべての指定文字を、(\r\n)の改行に置き換える。
492 char * swap_rn(char *(1), char(2));
493 (1) 文字列のポインター、予め動的に確保されたものであること。
496 使用例 > data = swap_rn(data, 'a');
499 通常は(1)を加工し、そのポインターを返します。
505 NULL_FREE() バッファーの使用された大きさ分だけNULLで埋める。
508 char * null_free(char *(1));
509 (1) NULLで埋めたいバッファのポインター
511 使用例 > data = null_free(data);
520 SELF_DELIM_GET() デリミターで区切られたデータの指定番めを取り出す、 固定バッファ用
523 int self_delim_get(char *(1), char *(2), char(3), int(4), int(5))
525 (2) char * 取り出したデータを入れるバファ(固定長)
530 使用例 > memset(data, 0x00, 1024);
531 ret = self_delim_get(base, data, ',', 4, 1024);
534 上の使用例ではbase内をデリミタ(,)で区切った場合の4番めの文字列をdataに
535 書き込む。書き込むバッファは固定長であり、充分な大きさを持つこと。
549 ----- 以下はソケット関係の関数リファレンス -----
554 SOCKET_READA() ファイルディスクリプタから動的なバッファに読み込む
557 int socket_reada(int(1), char *(2), int max);
558 (1) int ファイルディスクリプタ番号
559 (2) char * 受け取ったデータを格納するバッファ
562 使用例 > ret = socket_reada(sk, readdata, max);
565 戻り値が0の場合に読み込んだバファの終端が改行である場合に終了。
568 読み込んだバッファーのサイズを返す、失敗した場合は-1を返す。
577 SOCKET_READAS() ファイルディスクリプタから動的なバッファに読み込む (select付き)
580 int socket_readas(int(1), char *(2), int max, int interval, int mode);
581 (1) int ファイルディスクリプタ番号
582 (2) char * 受け取ったデータを格納するバッファ
584 (4) select time out 秒
587 使用例 > ret = socket_reada(sk, readdata, max, interval, 0);
590 ただやみくもにread()と使うのなら、こちら使ってください。
591 readごとにselectでfdを確認している
592 mode 1 は終端に改行が有る場合に終了、それ以外は0x0d,0x0aがある場合に終了。
593 intervalは上の条件を満たさずに、FDが次のデータを返さない場合の待ち時間。
596 読み込んだバッファーのサイズを返す、失敗した場合は-1を返す。
604 SOCKET_READASTH() ファイルディスクリプタから動的なバッファに読み込む (readのtimeoutあり)
607 int socket_readasth(int(1), char *(2), int max, int interval, int mode);
608 (1) int ファイルディスクリプタ番号
609 (2) char * 受け取ったデータを格納するバッファ
611 (4) select time out 秒
614 使用例 > ret = socket_readath(sk, readdata, max, interval, 0);
617 ただやみくもにread()を使うのなら、こちら使ってください。
618 readごとにselectでfdを確認している
619 複数回のread()のトータルの時間をtimeoutさせます。
620 mode 1 は終端に改行が有る場合に終了、それ以外は0x0d,0x0aがある場合に終了。
621 intervalは上の条件を満たさずに、FDが次のデータを返さない場合の待ち時間。
622 read()のtimeoutにpthreadを使っています。
623 スレッドの中で実行するなど同時に沢山実行する場合はスタックのサイズに注意してください。
626 読み込んだバッファーのサイズを返す、失敗した場合は-1を返す。
627 read()じたいで時間超過した場合は-2を返します。
634 SOCKET_READS() ファイルディスクリプタから動的なバッファに読み込む
637 int socket_reads(int(1), char *(2), int(3), int(4));
638 (1) int ファイルディスクリプタ番号
639 (2) char * 受け取ったデータを格納するバッファ(動的バッファ)
640 (3) int 受け取るデータサイズの上限
641 (4) int ファイルディスクリプタの変化を待つ時間 (sec)
643 使用例 > ret = socket_reads(sk, readdata, getlen, interval);
646 ファイルディスクリプタが変化するのを指定時間待ち、タイムアウトする。
647 変化があり、読み込めた場合は動的なサイズのバッファにデータを書き込む。
650 読み込んだバッファーのサイズを返す、失敗した場合やタイムアウトした場合
658 SOCKET_SENDS() ファイルディスクリプタに書き込む
661 int socket_sends(int(1), char *(2), int(3), char(4));
662 (1) int ファイルディスクリプタ番号
663 (2) char * 書き込むデータの入ったバッファ
664 (3) int ファイルディスクリプタの変化を待つ時間 (sec)
665 (4) char 通常は0 サーバ側で使う場合は 1 を指定
667 使用例 > ret = socket_sends(sk, senddata, 5, 0);
670 ファイルディスクリプタに書き込み可能になるのを待って書き込む。
673 書き込んだバッファーのサイズを返す。失敗した場合やタイムアウトの場合は
681 SOCKET_SEND() ファイルディスクリプタに書き込む
684 int socket_sends(int(1), char *(2), int(3));
685 (1) int ファイルディスクリプタ番号
686 (2) char * 書き込むデータの入ったバッファ
687 (3) int ファイルディスクリプタの変化を待つ時間 (sec)
689 使用例 > ret = socket_sends(sk, senddata, 5);
692 ファイルディスクリプタに書き込み可能になるのを待って書き込む。
695 書き込んだバッファーのサイズを返す。失敗した場合やタイムアウトの場合は
703 SELECT_FDCAT() ファイルディスクリプタから読み出しバファに格納
706 char * select_fdcat(int(1), char *(2), int *(3), int(4), int(5))
707 (1) int ファイルディスクリプタ番号
708 (2) char * 書き込むデータの入ったバッファ
709 (3) 返却ステータスのポインターを指定する。
713 使用例 > data = socket_sends(sk, data, &ret, MAX, interval);
723 ----- 以下はファイル操作関数リファレンス ----
726 FILE_COPY() ファイルをコピーする
729 int file_copy(char *(1), char *(2));
733 使用例 > ret = file_copy("/tmp/a.txt", "/tmp/b.txt");
736 読み込みファイルから読み込み、その内容をそのまま書き込みファイルにうつす。
739 失敗した場合は -1 を返す。成功した場合はコピーしたバイト数を返す。
745 UNLINKDIR() ディレクトリー内のファイルの一括削除
748 int unlinkdir(char *(1));
751 使用例 > ret = unlinkdir("/tmp/");
754 ディレクトリをオープンし、中に含まれるファイルをすべて消す。
757 失敗した場合(ディレクトリが開けない場合)は-1、または開けても削除に失敗し
765 ----- 以下は低水準関数リファレンス -----
770 CH_INT() 文字列が数字か+,-で構成されていることを確認
773 int ch_int(char *(1));
776 使用例 > ret = ch_int(data);
779 単純に、data 内に数字か正負記号以外が含まれた場合は-1を返し、無い場合は0を返す。
789 CH_INT2() 文字列が数字で構成されていることを確認
792 int ch_int2(char *(1));
795 使用例 > ret = ch_int2(data);
798 単純に、data 内に数字以外が含まれた場合は-1を返し、無い場合は0を返す。
808 CH_FLOAT() 文字列が数字と'.'で構成されていることを確認
811 int ch_float(char *(1));
814 使用例 > ret = ch_float(data);
817 単純に、data 内に数字と'.'以外が含まれた場合は-1を返し、無い場合は0を返す。
827 CH_INT3() 文字列が数字か任意の文字一つで構成されていることを確認
830 int ch_int3(char *(1), char(2));
834 使用例 > ret = ch_int3(data, ':');
837 単純に、data 内がすべて数字の場合と、中に任意の文字が含まれた場合は0、それ以外は-1を返す。
846 CH_INT4() 文字列が数字と任意の文字一つで構成されていることを確認
849 int ch_int4(char *(1), char(2));
853 使用例 > ret = ch_int4(data, ':');
856 単純に、data 内が数字と、任意の文字一文字で構成された場合は0、それ以外は-1を返す。
857 数字だけでも、任意の文字だけでも駄目で、両方だけで構成されること。
867 CH_INT_V6() dataがIPV6アドレスを構成する文字であることを確認
870 int ch_int_v6(char *(1));
873 使用例 > ret = ch_int_v6(data);
876 単純に、data 内にIPV6アドレスを構成する以外の文字が含まれた場合は-1を返し、無い場合
888 CH_INT_V4() dataがIPV4アドレスを構成する文字であることを確認
891 int ch_int_v4(char *(1));
894 使用例 > ret = ch_int_v4(data);
897 単純に、data 内にIPV4アドレスを構成する以外の文字が含まれた場合は-1を返し、無い場合
910 CH_CHAR() 文字列が数字かASCII文字であることを確認し、バッファーにコピーする。
913 int ch_char(char *(1), char *(2));
917 使用例 > ret = ch_char(data, cpydata);
920 1の中に含まれる数字とASCII文字だけを2のバッファーにコピーする。
921 終端に0x00を書き込む。2のバッファの大きさの確認はしないので注意。
924 コピーした数を返す。一つの移らない場合は0を返す。1、2が同じなら全てコピーしたことになる。
930 CHAR_COUNT() 文字列に検索するキャラクタが幾つ含まれるか数える
933 int char_count(char *(1), char(2));
937 使用例 > ret = char_count("123-567", '-');
940 例の場合、'123-567'の中に'-'が一つあるのでret=1になる。
950 CHAR_GET() 文字列をデリミターで区切り、指定番めの文字列をバッファに入れる。
953 int char_get(char[](1), char[](2), char(3), int(4));
955 (2) char[] 取り出されたデータを入れるバッファ。サイズチェックが無いので注意。
959 使用例 > ret = char_get("-123-456-789-", buf, '-', 2);
962 例の場合、文字列に'-'が表れる2番めから3番めまでの文字列'456'がbufに格納される。
973 CHAR_POINT() 文字列の中で指定文字が指定番めに表れる先頭からの位置を返す。
976 int char_point(char *(1), char(2), int(3));
981 使用例 > ret = char_point("-12-345-6789-", '-', 3);
984 例の場合、文字列に'-'が3番めに表れる先頭からの位置は7なので7を返す。
985 但し、先頭文字を0番めとして数えているので注意。
995 CLEAN_MEM() 文字列を指定した文字で全て書き換える。
998 int clean_mem(char[](1), char(2), int(3));
1003 使用例 > ret = clean_mem(buf, (char)0x00, (int)strlen(buf));
1006 例の場合、bufの中を全てNULL文字でうめる。
1018 COUNT_MEMCPY() 文字列の先頭から指定した数だけバッファにコピーする
1021 int count_memcpy(char[](1), char[](2), int(3));
1022 (1) char[] コピー先のバッファ、サイズチェックなしなので注意
1023 (2) char[] コピー元のバッファ
1024 (3) int (2)の先頭からコピーするバイト数
1026 使用例 > ret = count_memcpy(buf, "1234567", 3);
1029 例の場合、bufには123の文字列がコピーされる、終端は0x00で埋められる。
1040 COUNT_MEMCPY2() 文字列の指定位置から指定した数だけバッファにコピーする
1043 int count_memcpy(char[](1), char[](2), int(3));
1044 (1) char[] コピー先のバッファ、サイズチェックなしなので注意
1045 (2) char[] コピー元のバッファ
1046 (3) int 指定位置(先頭からのバイト数)
1047 (4) int (3)の位置からコピーするバイト数
1049 使用例 > ret = count_memcpy2(buf, "1234567", 3, 6);
1052 例の場合、bufには3456の文字列がコピーされる、終端は0x00で埋められる。
1065 DELIM_COUNT() 文字列をデリミターで区切り、指定番めの文字列の先頭位置と終端位置を返す。
1068 int delim_count(char *(1), char(2), int(3), int *(4), int *(5));
1072 (4) int * 切り出した文字列の先頭位置を返す、ポインター
1073 (5) int * 切り出した文字列の終端位置を返す、ポインター
1075 使用例 > ret = delim_count("1-23-456-789", '-', 2, &sta, &sto);
1078 例の場合、'-'デリミタで2こ目の文字列は456になるが、この先頭位置を終端いちを
1090 MEM_COUNT() 文字列に指定文字が最後に表れる場所(番め)を返す。
1093 int mem_count(char *(1), char(2));
1097 使用例 > ret = mem_count("12-345-678", '-');
1100 例の場合、'-'が最後に表れるのは先頭から6番めで、先頭を0とする。
1110 MEM_TCOUNT() 文字列に指定文字が最初に表れる場所(番め)を返す。
1113 int mem_tcount(char *(1), char(2));
1117 使用例 > ret = mem_tcount("12-345-678", '-');
1120 例の場合、'-'が最初に表れるのは先頭から2番めで、先頭を0とする。
1131 MEMCOUNT_CPM() 文字列の指定位置を別バッファにコピーする
1134 int memcount_cpm(char *(1), char *(2), int(3), int(4), int(5));
1135 (1) char * コピー先のバッファ。サイズ確認なしなので注意
1141 使用例 > ret = memcount_cpm(buf, "0123456789", 3, 5, 8);
1144 例の場合、先頭を0と数えるので、bufに入るのは345です。
1156 RM_CRLF() 文字列の中の\r\nを0x00に置き換える
1159 int rm_crlf(char *(1), int(2));
1161 (2) int 上限値、通常は strlen()の値
1163 使用例 > int = rm_crlf(data, (int)strlen(data));
1166 単純に改行コードをNULLに書き換えるので、文字列の途中にある場合は
1177 RM_CHAR() 文字列の中の特定の文字を消して、お尻をつめる。
1180 int rm_char(char *(1), char(2));
1184 使用例 > ret = rm_char(data, 'd');
1187 文字列の中に現れる指定文字を消して、後ろからその位置に詰める。
1191 消した文字数を返す。但しバッファーの中身が無くなった場合は0を返す。
1199 SET_MEM() 文字列の中の特定の文字を0x00に置き換える
1202 int set_mem(char *(1), char(2), int(3));
1205 (3) int 上限値、通常はstrlen()の値
1207 使用例 > ret = set_mem(data, 'd', (int)strlen(data));
1210 特定の文字を0x00に置き換える。文字列の途中に指定文字があると、
1222 SWAP_MEM() 特定の文字を特定の文字で置き換える
1225 int swap_mem(char *(1), char(2), char(3));
1226 (1) char * 置き換え元の文字列
1230 使用例 > ret = swap_mem(data, 'x', 'g');
1233 例の場合、data の中の'x'を全て 'g'に置き換える。
1244 SWAP_ARMEM() 特定の範囲の特定の文字を特定の文字で置き換える
1247 int swap_armem(char *(1), char(2), char(3), int(4), int(5));
1248 (1) char * 置き換え元の文字列
1254 使用例 > ret = swap_mem(data, 'x', 'g');
1257 例の場合、data の中の'x'を全て 'g'に置き換える。
1267 CHMEM() とにかく指定した数だけ0x00でうめる。
1270 int chmem(char *(1), int);
1271 (1) char * 置き換え元の文字列
1274 使用例 > ret = chmem(data, 10);
1277 とにかく指定した数だけ0x00でうめる。バッファの溢れは考慮しない。
1280 2に対して、0より少ない数を指定すると-1を返す。
1289 ----- 以下は特殊用途関数 -----
1292 BASE64() 文字列をbase64エンコードする。
1295 int base64(char[](1), int(2), char[](3));
1300 使用例 > base64(a, (int)strlen(a), b);
1303 上の場合aを64エンコードしてbに入れる。bの大きさは最低でもaの倍ないといけない。
1313 UJTOJ() EUC文字列をJISに変更する。
1316 int ujtoj(unsigned char *(1), unsigned char *(2));
1321 使用例 > ujtoj((unsigned char *)out, (unsigned char *)in);
1324 上の場合in(EUC)をout(JIS)に変換します。
1325 この関数は 「TCP_IP ネットワークプログラミング」から使わせていただいてます。
1335 SAFE_BASE64() 文字列をbase64エンコードする。 (動的バッファ)
1338 char * safe_base64(char *(1));
1339 (1) エンコードしたいバッファ。領域を予め動的に確保していること。
1341 使用例 > data = safe_base64(data);
1344 予め動的に確保されたバッファにエンコードしたい文字列を入れsafe_base64()に渡すと、
1345 同じバッファにbase64エンコードされた文字列を返します。
1346 このバッファは最大で渡した文字列の倍のサイズに動的に拡張されることに注意。
1357 SAFE_UJTOJ() EUC文字列をJISに変更する。(動的バッファ)
1360 char * safe_ujtoj(char *(1));
1361 (1) 変換したいバファ、(EUC をJISに変換)
1363 使用例 > data = safe_ujtoj(data);
1366 上の場合data (EUC)をdata(JIS)に変換します。
1377 MIME_UJTOJ() EUC文字列をJISに変換しながら、76文字で折り返しMIMEに従ったsubject文字に変更する。(動的バッファ)
1380 char * mime_ujtoj(char *(1));
1381 (1) EUC文字列バッファ。領域を予め動的に確保していること。
1383 使用例 > data = mime_ujtoj(data);
1386 上記の場合、EUC文字列をJISに変換しながら、76文字で折り返しMIMEに従ったsubject文字に変更した値を返す。
1396 RANDDATA() 指定した数字の幅の中から、マイクロ秒をseedとして生成した乱数を返す。
1399 int randdata(int (1), int (2));
1403 使用例 > randint = randdata(0, 10);
1406 上記の場合、0から10の間の数字のいずれかをマイクロ秒を種として出した乱数の値で返す。
1415 COUNTS() 指定した幅の数を少ない方から順番に返す。
1418 int counts(char * (1), int (2), int(3));
1419 (1) 数を書くファイル名(デフォルトでは/tmp/taro)
1423 使用例 > back = counts("/tmp/hage", 0, 10);
1426 上記の場合、0から10の間の数字のいずれかを少ない方から順番に返す。
1427 (1)は数を書き込んでおくファイルです。
1436 IN_BIT() '0101'で表現された文字列(2進数)を整数に変換する。
1439 unsigend long in_bit(char *(1), int(2));
1440 (1) '01010'で表現された文字列(2進数)
1445 memset(ch8, 0x00, 34);
1446 in8 = in_bit("01010101", 8);
1447 ch8 = out_bit(in8, ch8, 8);
1448 printf("in_bit() out_bit(): <%d><%s><%d>\n", in8, ch8, (int)in_bit(ch8, 8));
1451 上記の場合は'01010101'の文字列をin_Bit()にてin8に整数で与えている。
1454 整数を返す、文字列の幅と実際の文字列の長さが異なる場合は-1を返す。
1455 与えた文字列に0、1意外が含まれる場合は-2を返す。
1461 OUT_BIT() 整数を'01010'で表現される文字列(2進数)に変換する。
1464 char * out_bit(unsigned int(1), char *(2), int(3));
1465 (1) 文字列(2進数)に変換したい整数
1466 (2) 文字列を納めるバッファのポインター
1471 memset(ch8, 0x00, 34);
1472 in8 = in_bit("01010101", 8);
1473 ch8 = out_bit(in8, ch8, 8);
1474 printf("in_bit() out_bit(): <%d><%s><%d>\n", in8, ch8, (int)in_bit(ch8, 8));
1477 上記の場合は一旦整数として格納した'01010101'を再度文字列に戻している。
1486 SHIFT8_UPDOWN_IN() 32Bit整数を8Bitで4っに分けてそれぞれに8Bitで表現可能な数を入れる
1489 int = shift8_updown_in(int(1), int(2), int(3), int(4));
1490 (1) 24〜32ビットまでに入る8ビットで表現可能な数字
1491 (2) 16〜24ビットまでに入る8ビットで表現可能な数字
1492 (3) 8〜16ビットまでに入る8ビットで表現可能な数字
1493 (4) 0〜8ビットまでに入る8ビットで表現可能な数字
1497 int da = shift8_updown_in(255, 0, 0, 255);
1503 上の場合、32ビットの整数で255を返す
1510 SHIFT8_UPDOWN_OUT() 32Bit整数を8Bitで4っに分けて、それぞれの値を別に取り出す。
1513 int = shift8_updown_out(int(1), char(2));
1514 (1) shift8_updown_in()で作った整数
1518 int da = shift8_updown_out(shift8_updown_in(0,0,0,255), 'd');
1522 'd'は下位8ビット、'u'は8〜16、'm'は16〜24、't'は24〜32までに区切って返す。
1523 つまりintの整数に8ビットまでの4っの意味を持たすことが出来ます。
1526 上の場合、32ビットの整数で255を返す
1527 255までの整数なら、shift8_updown_out()を使う必要がない。
1534 INITDAEMON() 自分自身をバックグランドに落し、引数の場所にchdir()する
1537 void initdaemon(char *);
1543 自分自身をバックグランドに落し、引数の場所にchdir()する
1553 INITDAEMONS() 自分自身をバックグランドに落す
1556 void initdaemon(char *);
1573 CONVERT() バッファーの文字列を、指定した文字コードから指定した文字コードに変換する。
1576 char * convert(const char *, const char *, const char *, char *, size_t, int *);
1579 output_data = convert("UTF-8", "ISO-2002-JP", input_data, output_data, 5042, &ret);
1582 上記の例だと、3番めの引数にあたる(input_data)に入れた文字列をUTF-8と断定して、
1583 その文字列をISO-2002-JPに書き換え、(output_data)に戻す。
1584 (output_data)の大きさは5024を越えない。
1585 retのポインターは成功は0<、失敗は-*を返します。
1588 戻り値はoutput_dataのポインターを返す。
1595 SELF_CONVERT_DATA() バッファーの文字列を、指定した文字コードから指定した文字コードに変換する。文字数の制限つき。普通のバッファー用
1598 int self_convert_data(const char *, const char *, char *, size_t);
1601 ret = self_convert_data("UTF-8", "ISO-2002-JP", data, 5042);
1604 上記の例だと、3番めの引数にあたる(data)に入れた文字列をUTF-8と断定して、
1605 その文字列をISO-2002-JPに書き換え、(data)に戻す。
1606 (data)の大きさは5024を越えない。
1616 SAFE_CONVERT_DATA() バッファーの文字列を、指定した文字コードから指定した文字コードに変換する。(動的バッファー)
1619 char * safe_convert_data(const char *, const char *, char *, int *);
1622 ret = self_convert_data("UTF-8", "ISO-2002-JP", malloc_data, &ret);
1625 上記の例だと、3番めの引数にあたる(data)に入れた文字列をUTF-8と断定して、
1626 その文字列をISO-2002-JPに書き換え、(data)に戻す。
1628 retのポインターは成功は0<、失敗は-*を返します。
1632 戻り値はoutput_dataのポインターを返す。
1641 ----- 以下は時間関係の関数リファレンス -----
1646 CHAR_WDAY() 0から6の数字から3文字の曜日を示す文字列をかえす。
1649 char * char_wday(int (1));
1650 (1) int 0から6の数字。以下は数字が示す曜日、また戻す文字列
1660 使用例 > char * cha = char_wday(0);
1663 例の場合、'Sun' という文字列がかえされる。
1666 意外の数字を与えた場合は'Not!'が返される。
1675 CHAR_MON() 0から11の数字から3文字の月を示す文字列をかえす。
1678 char * char_mon(int (1));
1679 (1) int 0から11の数字。以下は数字が示す月、また戻す文字列
1695 使用例 > char * mon = char_mon(0);
1698 例の場合、'Jan' という文字列がかえされる。
1701 意外の数字を与えた場合は'Not!'が返される。
1708 UTIME_GETR() unix time からcharで指定した時間をかえす
1711 int utime_getr(time_t(1), char(2));
1717 'w': 曜日(0 - 6 CHAR_WDAY() を参照)
1723 使用例 > int day = utime_getr((time_t)lin, 'd');
1726 例の場合、lin という数字をUNIX TIMEに置き換えて、その時の日日を計算して整数でかえす
1737 CTIME_GETR() 現在時刻の指定文字の示す時間属性をかえす */
1740 int ctime_getr(char (1))
1745 'w': 曜日(0 - 6 CHAR_WDAY() を参照)
1751 使用例 > int day = ctime_getr('d');
1766 TIME_PLAS() cha 単位で t 時 に mt 時間プラスした時間を返す関数 23 + 2 = 1
1769 int time_plas(int t(1), int mt(2), char cha(3))
1777 使用例 > int ha = time_plas(23, 2, 'h');
1780 例の場合、23時に2時間足した場合の時間、1時が返る
1795 DAY_PLASMINUS() 一日前後の日、月、年を出す
1798 int day_plas(int * (1), int * (2), int * (3), char(4))
1802 (4) 記号 '+' は一日プラス、'-'は一日マイナスする
1804 使用例 > day_plas(&year, &month, &day, '+');
1807 一日後の日月年を出す、うるう年も加味している。
1821 GET_UNIXTIME() localな時間からUNIX時間をかえす。
1824 time_t get_unixtime(int ye(1), int mo(2), int day(3), int hour(4), int min(5), int sec(6))
1833 使用例 > time_t tt = get_unixtime(1970, 1, 1, 1, 1, 1)
1845 MESSAGE_ID() 出きるだけユニークなメッセージIDを作ります。
1848 char * message_id(char *(1), char *(2), char *(3));
1849 (1) データを戻したいバッファ、戻り値と同じポインターを指定、予めmallocされていること。
1853 使用例 retp = message_id(retp, "taro", "zither.ms-n.com");
1856 出力フォーマットは年月日時分.ランダムな数字.名前@ドメイン名
1866 DAY_MINUS() 現在の年月で、一日前の日をかえす。(1 - 1 = 31)
1869 int day_minus(int(1))
1872 使用例 > int a = day_minus(31);
1875 例の場合、 aには0日が入るかもしれない
1876 うるう年や月が28日か30、31なのかの判断は現在の月から判断する。
1888 MONTH_LAST() 何年何月の最後の日を出す
1891 int month_last(int(1), int(2));
1895 使用例 > int mo = month_last(2008, 1);
1898 例の場合、moには2008年1月の最後の日である31が返る。うるう年も考慮される。
1911 MONTH_MINUS() 指定月から一ヶ月引いた月をかえす。単純。。。
1914 int month_minus(int(1))
1917 使用例 > int month_minus(1);
1920 例の場合、1月の前の月は12月なので12が返る。
1933 TIME_GETR() 現在時刻の:区切りの文字列をバッファにかえす。
1936 char * time_getr(char *(1));
1937 (1) 文字列を返すバッファのポインター
1939 使用例 > char * data = time_getr(data);
1942 例の場合、data に 2007:09:28:02:22:59 のような文字列が入る。
1943 data は予め動的に確保されている必要がある。