OSDN Git Service

addid library source 20140221
[zither/ds-zither.git] / sources / lib / libms / README.utfjp
1 /* 
2 * 以下関数群は動的なメモリーの割り当てを前提にした、c言語のための標準的文字列操作の関数です。
3 * 私が自分のプログラミングの為に書きました。
4 * どなたでもご利用になれますし、書き換えも構いません。
5 * この関数は私 Masashi Shimakuraが20051123に書きました、現在でもメンテナンスを行ってます。
6 * 何かお気づきの点がありましたら以下にご連絡ください。
7 * インストールされる場合は同封のINSTALL.utfjpファイルを確認してください。 
8 * 具体的な書き方はlibmstestのソースであるtest.cを確認する方法もあります。
9 *
10 *     mail: masashi@ms-n.com
11 *     2014/02/20 書き換えました
12 *
13 */
14
15 このFILEは libms.so ライブラリに含まれる以下の関数の使いかたを説明しています。
16
17    (以下は動的アロケーションの関数)
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で埋める。
32
33    (以下は通常の関数)
34    SELF_MEMCPY() 指定サイズを越えないメモリーコピー
35    SELF_STRNCAT() 指定サイズを越えないでバッファーの後端に文字列を追加する
36    SELF_MEMCMP() お互いの大きさも考慮した文字列の比較
37    SELF_DELIM_GET() デリミターで区切られたデータの指定番めを取り出す、動的なバッファーを使わない
38
39    (以下はソケット関数)
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() ファイルディスクリプタから読み込む
47
48    (以下はFILE操作関数)
49    FILE_COPY() ファイルのコピー
50    UNLINKDIR() ディレクトリー内のファイルの一括削除
51
52
53
54    (以下は低水準な関数)
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でうめる。
79
80
81    (以下は特殊用途関数)
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() バッファーの文字列を、指定した文字コードから指定した文字コードに変換する。(動的バッファー)
98
99
100
101    (以下は時間関係の関数リファレンス)
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() 現在時刻の:区切りの文字列をバッファにかえす。
114
115
116
117
118
119
120
121       
122    ----- 以下は動的アロケーション関数リファレンス -----
123
124
125
126
127 名前
128    SAFE_FPCAT() ファイルポインターから一行読み込む
129
130 書式
131    char * safe_fpcat(FILE *(1), char *(2), int *(3), int(4));
132    (1) ファイルポインター
133    (2) char * すでにmalloc()で確保されたバッファーを指定(通常戻り値も同じになる)
134    (3) 終了ステータス(int ポインター) 、異常は(-1)を返す。
135    (4) int 確保するバッファーの上限
136
137    使用例   >   data = safe_fpcat(fp, data, &stat, MAX_LEN);
138
139 説明
140    ファイルポインターから一行バッファーに読み込み終了する関数。(動的バッファー)
141    得られるバッファーの後端に改行を含まない。
142    バッファーのアドレスは変化するので戻り値(char *)を信用すること、通常の使用では(2)
143    と戻り値の変数は同じになる。
144
145 返り値
146    動的にサイズを調整(mallc)したバッファのアドレスを返す。失敗した場合はNULLを返す。
147
148
149
150
151
152 名前
153    SAFE_FDCPM() ファイルディスクリプターから一行読み込む
154
155 書式
156    char * safe_fdcpm(int(1), char *(2), int *stat(3), int(4));
157    (1) int ファイルディスクプリター
158    (2) char * すでにmalloc()で確保されたバッファーを指定(通常戻り値も同じになる)
159    (3) 終了ステータス(intポインター) 、異常は(-1)を返す。
160    (4) int 確保するバッファーの上限
161
162    使用例   >   data = safe_fdcpm(fd, data,  &stat, MAX_LEN);
163
164 説明
165    ファイルディスクプリターから改行まで読み込み終了する関数。(動的バッファー)
166    得られるバッファーの後端に改行を含む。
167    但し閾値を超えた場合はバッファーの後端に改行を含まないので、含まない場合はエラー
168    とするか再度読むように使うこと。 バッファーのアドレスは変化するので戻り値(char *)
169    を信用すること、通常の使用では(2)と戻り値の変数は同じになる。
170
171 返り値
172    動的にサイズを調整(mallc)したバッファのアドレスを返す。失敗した場合はNULLを返す。
173
174
175
176
177
178
179 名前
180    SAFE_FDCAT() ファイルディスクリプターから改行まで読み込む
181
182 書式
183    char * safe_fdcat(int(1), char *(2), int *stat(3), int(4), int(5));
184    (1) int ファイルディスクプリター
185    (2) char * すでにmalloc()で確保されたバッファーを指定(通常戻り値も同じになる)
186    (3) 終了ステータス(ポインター) 、異常は(-1)を返す。
187    (4) int 確保するバッファーの上限。
188    (5) int select()にてタイムアウトを見る際の時間(sec)
189
190    使用例   >   data = safe_fdcat(fd, data, &stat, MAX_LEN, time);
191
192 説明
193    ファイルディスクプリターから改行まで読み込み終了する関数。(動的バッファー)
194    得られるバッファーの後端に改行を含む。 但し閾値を超えた場合は改行のみを書き込
195    む。この場合得られるデータは改行のみとなる。問題のおきた場合のステータスは常に
196    -1 で、正常な場合は得たバイト数を返す。0の場合は正常である。
197
198 返り値
199    動的にサイズを調整(mallc)したバッファのアドレスを返す。失敗した場合はNULLを返す。
200
201
202
203
204
205
206 名前
207    SAFE_FILEFDCAT() ファイルディスクリプターからストリーム終端まで読み込む
208
209 書式
210    char * safe_filefdcat(int(1), char *(2), int *stat(3), int(4), int(5));
211    (1) int ファイルディスクプリター
212    (2) char * すでにmalloc()で確保されたバッファーを指定(通常戻り値も同じになる)
213    (3) 終了ステータス(ポインター) 、異常は(-1)を返す。
214    (4) int 確保するバッファーの上限。
215    (5) int select()にてタイムアウトを見る際の時間(sec)
216
217    使用例   >   data = safe_filefdcat(fd, data, indata, &stat, MAX_LEN);
218
219 説明
220    ファイルディスクプリターからストリームの終端まで読み込み終了する関数。(動的バッファー)
221    得られるバッファーの後端に改行を含む。 但し閾値を超えた場合はバッファーの後端に改行を
222    書き込み、それ以後改行が読まれるまでfdを空読みする。 EOF(End of file)が読まれるまで
223    ループを抜けない点に注意。 バッファーのアドレスは変化するので戻り値(char *)を信用する
224    こと、通常の使用では(2)と戻り値の変数は同じになる。
225
226 返り値
227    動的にサイズを調整(mallc)したバッファのアドレスを返す。失敗した場合はNULLを返す。
228
229
230
231
232
233 名前
234    SAFE_MEMCPY() バッファーに任意のサイズの文字列をコピーする
235
236 書式
237    char * safe_memcpy(char *(1), char *(2), int(3));
238    (1) char * char * すでにmalloc()で確保されたバッファーを指定(通常戻り値も同じになる)
239    (2) char * 読み込むバッファー。
240    (3) int 確保するバッファーの上限
241
242    使用例   >   data = safe_memcpy(data, indata, MAX_LEN);
243
244 説明
245    バッファーからバッファーにデータをコピーする関数。(動的バッファー)
246
247 返り値
248    動的にサイズを調整(mallc)したバッファのアドレスを返す。失敗した場合はNULLを返す。
249
250
251
252
253
254
255 名前
256    SAFE_STRNCAT() 既に使われているバッファーの後ろに文字列を追加する
257
258 書式
259    char * safe_strncat(char *(1), char *(2), int(3));
260    (1) char * すでにmalloc()で確保されたバッファーを指定(通常戻り値も同じになる)
261    (2) char * 読み込むバッファー。
262    (3) int 確保するバッファーの上限
263
264    使用例   >   data = safe_strncat(data, indata, MAX_LEN);
265
266 説明
267    すでにあるバッファーの大きさを変更して、すでに入っているデータの後ろにデータを追加
268    する関数。(動的バッファー)
269
270 返り値
271    動的にサイズを調整(mallc)したバッファのアドレスを返す。失敗した場合はNULLを返す。
272
273
274
275
276
277
278 名前
279    SAFE_SPRINTF() フォーマット文字列をバッファーにコピーする
280
281 書式
282    char * safe_sprintf(char *(1), int(4), const char *(2), format, ...);
283    (1) char * すでにmalloc()で確保されたバッファーを指定(通常戻り値も同じになる)
284    (2) フォーマット文字列 " taro %d?n"
285    (3) フォーマット用変数、データ(数は10個まで)
286    (4) int 確保するバッファーの上限
287
288    使用例   >   data = safe_sprintf(data, MAX_LEN, "--%d--?n", inA);
289
290 説明
291    フォーマット文字列から指定したバッファーにデータを追加する関数。(動的バッファー)
292    読み込みバッファーを指定して書き込むことは出来ませんので注意。
293
294 返り値
295    動的にサイズを調整(mallc)したバッファのアドレスを返す。失敗した場合はNULLを返す。
296
297
298
299
300
301
302 名前
303    DELIM_GET() デリミターで区切られたデータの指定番めを取り出す
304
305 書式
306    char * delim_get(char *(1), char *(2), char(3), int *(4), int(5));
307    (1) char * 元データ
308    (2) char * 取り出したデータを入れるバファ
309    (3) デリミター
310    (4) ステータス、異常は-1
311    (5) 何番めかの指定
312
313    使用例      >     data = delim_get(base, data, ',', %stat, 4);
314
315 説明
316    上の使用例ではbase内をデリミタ(,)で区切った場合の4番めの文字列をdataに
317    書き込む。書き込むバッファは予めmalloc()されている必要がある。
318
319 帰り値
320    失敗した場合は返却文字列に"NOT"を書き込む。
321    終端には0x00が入る。
322
323
324
325
326
327 名前
328    DELIM_F() デリミターで区切られた文字列の先頭からX個分をコピーする
329
330 書式
331    char * delim_f(char *(1), char * (2), char(3), int(4));
332    (1) char * 元データ
333    (2) char * 取り出したデータを入れるバファ
334    (3) デリミター
335    (4) 何番めかの指定
336
337    使用例      >     data = delim_f(base, data, ',', 4);
338
339 説明
340    上記の例だと、base を区切る','の4個めまでの文字列をdataにコピーする。
341    最後にデリミターを追加することに注意
342
343 帰り値
344    文字列のポインターを返す
345
346
347
348
349 名前
350    DELIM_R() デリミターで区切られた文字列のX個目から後ろをコピーする
351
352 書式
353    char * delim_r(char *(1), char * (2), char(3), int(4));
354    (1) char * 元データ
355    (2) char * 取り出したデータを入れるバファ
356    (3) デリミター
357    (4) 何番めかの指定
358
359    使用例      >     data = delim_r(base, data, ',', 4);
360
361 説明
362    上記の例だと、base を区切る','の4個めから後ろの文字列をdataにコピーする。
363    最後にデリミターを追加しないことに注意
364
365 帰り値
366    文字列のポインターを返す
367
368
369
370
371
372
373
374
375    ----- 以下は通常関数のリファレンス -----
376
377
378
379
380 名前
381    SELF_MEMCPY() 指定サイズを越えないメモリーコピー
382
383 書式
384    int self_memcpy(char *(1), char *(2), int(3));
385    (1) char * コピー先のバッファ
386    (2) char * コピー元のバッファ
387    (3) int コピーする文字列の上限、普通は(1)で確保されている上限サイズ
388
389    使用例    >   ret = self_memcpy(data, "ABCD", 128);
390
391 説明
392    大きさが固定のバッファーに対して、安全にデータをコピーする。
393
394 返り値
395    つねに0を返す
396
397
398
399
400
401 名前
402    SELF_STRNCAT() 指定サイズを越えないでバッファーの後端に文字列を追加する
403
404 書式
405    int self_strncat(char *(1), char *(2), int(3));
406    (1) char * コピー先のバッファ
407    (2) char * コピー元のバッファ
408    (3) int コピーする文字列の上限、普通は(1)で確保されている上限サイズ
409
410    使用例    >   ret = self_memcpy(data, "ABCD", 128);
411
412 説明
413    大きさが固定のバッファーに対して、安全にデータを後端にコピーする。
414
415 返り値
416    つねに0を返す
417
418
419
420
421
422 名前
423    SELF_MEMCMP() お互いの大きさも考慮した文字列の比較
424
425 書式
426    int self_memcmp(char *(1), char *(2));
427    (1) char * 比較文字列1
428    (2) char * 比較文字列2
429
430    使用例     >   ret = self_memcmp(data1, "taro");
431
432 説明
433    文字列同士の比較だが、サイズが違う場合もエラーと判断する。
434
435 返り値
436    通常のmemcmp()と同じだが、サイズが違う場合も-1を返す。
437
438
439
440
441
442
443 名前
444    ALGET_READ() fdから得たデータをネゴしながら行単位で受け取りファイルに書き出す関数。
445
446 書式
447    char * alget_read(char *(1), int(2), int(3), int(4), int *(5), char(6), int(7), int(8));
448    (1) 書き出すファイルのパス名前
449    (2) データを置くバファ(意味ないので、いずれなくします)
450    (3) ファイルディスクリプター
451    (4) 返却ステータスのポインター
452    (5) 受け取りデータの特定の文字を置き換えます。(普通は送信時に改行を何に変えているか)
453    (6) この数字よりサイズが大きいとデータの受け取りを一時中断しますが、実際の単位は行単位です。
454    (7) mode 1 client -> server  最後にステータスを送る
455        mode 0 server -> client  受け取って終わり
456
457 使用例
458    rec = alget_read(filename, rec, sk, interval, &stat, delim, file_len, mode);
459
460 返り値
461    (2)のポインターを返すが、現状で意味がないので、いずれへんこうします。
462
463
464
465
466 名前
467    ALGET_WRITE()  FPから一行ずつ読み出したデータをネゴしながら一定量小分けでsendする関数
468
469 書式
470    int alget_write(int(1), FILE *(2), int(3), char(4), int(5), int(6));
471    (1) ファイルディスクリプター
472    (2) 書き出すファイルのファイルポインター
473    (3) select()の待ち時間(秒)
474    (4) 送信データの特定の文字を置き換えます。(普通は送信時に改行を何に変えるか)
475    (5) この数字よりサイズが大きいとデータの受け取りを一時中断しますが、実際の単位は行単位です。
476    (6) mode 1 client -> server  最後にステータスを送る
477        mode 0 server -> client  受け取って終わり
478
479 使用例
480    ren = alget_write(int sock_fd, FILE * fp, int interval, char delim, int file_len, int mode);
481
482 返り値
483    エラーの場合は-1を返します。
484
485
486
487
488 名前
489    SWAP_RN() 文字列全体の中のすべての指定文字を、(\r\n)の改行に置き換える。 
490
491 書式
492    char * swap_rn(char *(1), char(2));
493    (1) 文字列のポインター、予め動的に確保されたものであること。
494    (2) 置き換える文字。
495
496    使用例   >   data = swap_rn(data, 'a');
497
498 返り値
499    通常は(1)を加工し、そのポインターを返します。
500
501
502
503
504 名前
505    NULL_FREE() バッファーの使用された大きさ分だけNULLで埋める。
506
507 書式
508    char * null_free(char *(1));
509    (1) NULLで埋めたいバッファのポインター
510
511    使用例      >     data = null_free(data);
512
513 返り値
514    ポインターを返す
515
516
517
518
519 名前
520    SELF_DELIM_GET() デリミターで区切られたデータの指定番めを取り出す、 固定バッファ用
521
522 書式
523    int self_delim_get(char *(1), char *(2), char(3), int(4), int(5))
524    (1) char * 元データ
525    (2) char * 取り出したデータを入れるバファ(固定長)
526    (3) デリミター
527    (4) 何番めかの指定
528    (5) 2バッファーの大きさ
529
530    使用例      > memset(data, 0x00, 1024);
531                  ret = self_delim_get(base, data, ',', 4, 1024);
532
533 説明
534    上の使用例ではbase内をデリミタ(,)で区切った場合の4番めの文字列をdataに
535    書き込む。書き込むバッファは固定長であり、充分な大きさを持つこと。
536
537 帰り値
538    失敗した場合は-1を返す。
539    終端には0x00が入る。
540
541
542
543
544
545
546
547
548
549    ----- 以下はソケット関係の関数リファレンス -----
550
551
552
553 名前
554    SOCKET_READA() ファイルディスクリプタから動的なバッファに読み込む  
555
556 書式
557    int socket_reada(int(1), char *(2), int max);
558    (1) int  ファイルディスクリプタ番号
559    (2) char *  受け取ったデータを格納するバッファ
560    (3) バッファの最大数
561
562    使用例    >    ret =  socket_reada(sk, readdata, max);
563
564 説明
565    戻り値が0の場合に読み込んだバファの終端が改行である場合に終了。
566
567 返り値
568    読み込んだバッファーのサイズを返す、失敗した場合は-1を返す。
569    バッファーの溢れなどは確認しない。
570
571
572
573
574
575
576 名前
577    SOCKET_READAS() ファイルディスクリプタから動的なバッファに読み込む  (select付き)
578
579 書式
580    int socket_readas(int(1), char *(2), int max, int interval, int mode);
581    (1) int  ファイルディスクリプタ番号
582    (2) char *  受け取ったデータを格納するバッファ
583    (3) バッファの最大数
584    (4) select time out 秒
585    (5) 終了モード
586
587    使用例    >    ret =  socket_reada(sk, readdata, max, interval, 0);
588
589 説明
590    ただやみくもにread()と使うのなら、こちら使ってください。
591    readごとにselectでfdを確認している
592    mode 1 は終端に改行が有る場合に終了、それ以外は0x0d,0x0aがある場合に終了。
593    intervalは上の条件を満たさずに、FDが次のデータを返さない場合の待ち時間。
594
595 返り値
596    読み込んだバッファーのサイズを返す、失敗した場合は-1を返す。
597    バッファーの溢れなどは確認しない。
598
599
600
601
602
603 名前
604    SOCKET_READASTH() ファイルディスクリプタから動的なバッファに読み込む  (readのtimeoutあり)
605
606 書式
607    int socket_readasth(int(1), char *(2), int max, int interval, int mode);
608    (1) int  ファイルディスクリプタ番号
609    (2) char *  受け取ったデータを格納するバッファ
610    (3) バッファの最大数
611    (4) select time out 秒
612    (5) 終了モード
613
614    使用例    >    ret =  socket_readath(sk, readdata, max, interval, 0);
615
616 説明
617    ただやみくもにread()を使うのなら、こちら使ってください。
618    readごとにselectでfdを確認している
619    複数回のread()のトータルの時間をtimeoutさせます。
620    mode 1 は終端に改行が有る場合に終了、それ以外は0x0d,0x0aがある場合に終了。
621    intervalは上の条件を満たさずに、FDが次のデータを返さない場合の待ち時間。
622    read()のtimeoutにpthreadを使っています。
623    スレッドの中で実行するなど同時に沢山実行する場合はスタックのサイズに注意してください。
624
625 返り値
626    読み込んだバッファーのサイズを返す、失敗した場合は-1を返す。
627    read()じたいで時間超過した場合は-2を返します。
628
629
630
631
632
633 名前
634    SOCKET_READS() ファイルディスクリプタから動的なバッファに読み込む  
635
636 書式
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)
642
643    使用例    >    ret =  socket_reads(sk, readdata, getlen, interval);
644
645 説明
646    ファイルディスクリプタが変化するのを指定時間待ち、タイムアウトする。
647    変化があり、読み込めた場合は動的なサイズのバッファにデータを書き込む。
648
649 返り値
650    読み込んだバッファーのサイズを返す、失敗した場合やタイムアウトした場合
651    は-1を返す。
652
653
654
655
656
657 名前
658    SOCKET_SENDS() ファイルディスクリプタに書き込む
659
660 書式
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 を指定
666
667    使用例     >    ret = socket_sends(sk, senddata, 5, 0);
668
669 説明
670    ファイルディスクリプタに書き込み可能になるのを待って書き込む。
671
672 返り値
673    書き込んだバッファーのサイズを返す。失敗した場合やタイムアウトの場合は
674    -1を返す。
675
676
677
678
679
680 名前
681    SOCKET_SEND() ファイルディスクリプタに書き込む
682
683 書式
684    int socket_sends(int(1), char *(2), int(3));
685    (1) int ファイルディスクリプタ番号
686    (2) char * 書き込むデータの入ったバッファ
687    (3) int ファイルディスクリプタの変化を待つ時間 (sec)
688
689    使用例     >    ret = socket_sends(sk, senddata, 5);
690
691 説明
692    ファイルディスクリプタに書き込み可能になるのを待って書き込む。
693
694 返り値
695    書き込んだバッファーのサイズを返す。失敗した場合やタイムアウトの場合は
696    -1を返す。
697
698
699
700
701
702 名前
703    SELECT_FDCAT() ファイルディスクリプタから読み出しバファに格納
704
705 書式
706    char * select_fdcat(int(1), char *(2), int *(3), int(4), int(5))
707    (1) int ファイルディスクリプタ番号
708    (2) char * 書き込むデータの入ったバッファ
709    (3) 返却ステータスのポインターを指定する。
710    (4) バファに格納する上限サイズ
711    (5) select()の待ち時間(秒)
712
713    使用例     >    data = socket_sends(sk, data, &ret, MAX, interval);
714
715 返り値
716    読み出したデータを返す。
717
718
719
720
721
722
723    ----- 以下はファイル操作関数リファレンス ----
724
725 名前
726     FILE_COPY() ファイルをコピーする
727
728 書式
729     int file_copy(char *(1), char *(2));
730     (1) char * 読み込むファイル名
731     (2) char * 書き込むファイル名
732
733     使用例      >      ret = file_copy("/tmp/a.txt", "/tmp/b.txt");
734
735 説明
736     読み込みファイルから読み込み、その内容をそのまま書き込みファイルにうつす。
737
738 返り値
739     失敗した場合は -1 を返す。成功した場合はコピーしたバイト数を返す。
740
741
742
743
744 名前
745    UNLINKDIR() ディレクトリー内のファイルの一括削除
746
747 書式
748    int unlinkdir(char *(1));
749    (1) char * ディレクトリ名
750
751    使用例       >      ret = unlinkdir("/tmp/");
752
753 説明
754    ディレクトリをオープンし、中に含まれるファイルをすべて消す。
755
756 返り値
757    失敗した場合(ディレクトリが開けない場合)は-1、または開けても削除に失敗し
758    たファイル数の分だけ-1していく。
759
760
761
762
763
764
765    ----- 以下は低水準関数リファレンス -----
766
767
768
769 名前
770    CH_INT() 文字列が数字か+,-で構成されていることを確認
771
772 書式
773    int ch_int(char *(1));
774    (1) チェックするバッファ
775
776    使用例    >    ret = ch_int(data);
777
778 説明
779    単純に、data 内に数字か正負記号以外が含まれた場合は-1を返し、無い場合は0を返す。
780
781 返り値
782    説明に従う
783
784
785
786
787
788 名前
789    CH_INT2() 文字列が数字で構成されていることを確認
790
791 書式
792    int ch_int2(char *(1));
793    (1) チェックするバッファ
794
795    使用例    >    ret = ch_int2(data);
796
797 説明
798    単純に、data 内に数字以外が含まれた場合は-1を返し、無い場合は0を返す。
799
800 返り値
801    説明に従う
802
803
804
805
806
807 名前
808    CH_FLOAT() 文字列が数字と'.'で構成されていることを確認
809
810 書式
811    int ch_float(char *(1));
812    (1) チェックするバッファ
813
814    使用例    >    ret = ch_float(data);
815
816 説明
817    単純に、data 内に数字と'.'以外が含まれた場合は-1を返し、無い場合は0を返す。
818
819 返り値
820    説明に従う
821
822
823
824
825
826 名前
827    CH_INT3() 文字列が数字か任意の文字一つで構成されていることを確認
828
829 書式
830    int ch_int3(char *(1), char(2));
831    (1) チェックするバッファ
832    (2) 文字
833
834    使用例    >    ret = ch_int3(data, ':');
835
836 説明
837    単純に、data 内がすべて数字の場合と、中に任意の文字が含まれた場合は0、それ以外は-1を返す。
838
839 返り値
840    説明に従う
841
842
843
844
845 名前
846    CH_INT4() 文字列が数字と任意の文字一つで構成されていることを確認
847
848 書式
849    int ch_int4(char *(1), char(2));
850    (1) チェックするバッファ
851    (2) 文字
852
853    使用例    >    ret = ch_int4(data, ':');
854
855 説明
856    単純に、data 内が数字と、任意の文字一文字で構成された場合は0、それ以外は-1を返す。
857    数字だけでも、任意の文字だけでも駄目で、両方だけで構成されること。
858
859 返り値
860    説明に従う
861
862
863
864
865
866 名前
867    CH_INT_V6() dataがIPV6アドレスを構成する文字であることを確認
868
869 書式
870    int ch_int_v6(char *(1));
871    (1) チェックするバッファ
872
873    使用例    >    ret = ch_int_v6(data);
874
875 説明
876    単純に、data 内にIPV6アドレスを構成する以外の文字が含まれた場合は-1を返し、無い場合
877    は0を返す。
878
879 返り値
880    説明に従う
881
882
883
884
885
886
887 名前
888    CH_INT_V4() dataがIPV4アドレスを構成する文字であることを確認
889
890 書式
891    int ch_int_v4(char *(1));
892    (1) チェックするバッファ
893
894    使用例    >    ret = ch_int_v4(data);
895
896 説明
897    単純に、data 内にIPV4アドレスを構成する以外の文字が含まれた場合は-1を返し、無い場合
898    は0を返す。
899
900 返り値
901    説明に従う
902
903
904
905
906
907
908
909 名前
910    CH_CHAR() 文字列が数字かASCII文字であることを確認し、バッファーにコピーする。
911
912 書式
913    int ch_char(char *(1), char *(2));
914    (1) チェックするバッファ
915    (2) コピー先バッファ
916
917 使用例     >      ret = ch_char(data, cpydata);
918
919 説明
920    1の中に含まれる数字とASCII文字だけを2のバッファーにコピーする。
921    終端に0x00を書き込む。2のバッファの大きさの確認はしないので注意。
922
923 返り値
924    コピーした数を返す。一つの移らない場合は0を返す。1、2が同じなら全てコピーしたことになる。
925
926
927
928
929 名前
930    CHAR_COUNT() 文字列に検索するキャラクタが幾つ含まれるか数える
931
932 書式
933    int char_count(char *(1), char(2));
934    (1) char * 検索される文字列
935    (2) char 検索文字
936
937    使用例     >    ret = char_count("123-567", '-');
938
939 説明
940    例の場合、'123-567'の中に'-'が一つあるのでret=1になる。
941
942 返り値
943    説明に従う
944
945
946
947
948
949 名前
950    CHAR_GET() 文字列をデリミターで区切り、指定番めの文字列をバッファに入れる。
951
952 書式
953    int char_get(char[](1), char[](2), char(3), int(4));
954    (1) char[] 検索される文字列
955    (2) char[] 取り出されたデータを入れるバッファ。サイズチェックが無いので注意。
956    (3) デリミター文字
957    (4) デリミターの位置番め
958
959    使用例    >    ret = char_get("-123-456-789-", buf, '-', 2);
960
961 説明
962    例の場合、文字列に'-'が表れる2番めから3番めまでの文字列'456'がbufに格納される。
963    終端には0x00が入る。
964
965 返り値
966    返す文字列のサイズを返す。
967
968
969
970    
971
972 名前
973    CHAR_POINT() 文字列の中で指定文字が指定番めに表れる先頭からの位置を返す。
974
975 書式
976    int char_point(char *(1), char(2), int(3));
977    (1) char * 検索文字列
978    (2) char 検索文字
979    (3) int 検索文字の位置(番め)
980
981    使用例    >    ret = char_point("-12-345-6789-", '-', 3);
982
983 説明
984    例の場合、文字列に'-'が3番めに表れる先頭からの位置は7なので7を返す。
985    但し、先頭文字を0番めとして数えているので注意。
986
987 返り値
988    説明に従う
989
990
991
992
993
994 名前
995    CLEAN_MEM() 文字列を指定した文字で全て書き換える。
996
997 書式
998    int clean_mem(char[](1), char(2), int(3));
999    (1) char[] 書き換えるバッファ
1000    (2) char 書き換える文字
1001    (3) バッファのサイズ
1002
1003    使用例     >    ret = clean_mem(buf, (char)0x00, (int)strlen(buf));
1004
1005 説明
1006    例の場合、bufの中を全てNULL文字でうめる。
1007    後端から埋めていくことに注意。
1008
1009 返り値
1010    成功した場合は0を返す。
1011
1012
1013
1014
1015
1016
1017 名前
1018    COUNT_MEMCPY() 文字列の先頭から指定した数だけバッファにコピーする
1019
1020 書式
1021    int count_memcpy(char[](1), char[](2), int(3));
1022    (1) char[] コピー先のバッファ、サイズチェックなしなので注意
1023    (2) char[] コピー元のバッファ
1024    (3) int (2)の先頭からコピーするバイト数
1025
1026    使用例     >   ret = count_memcpy(buf, "1234567", 3);
1027
1028 説明
1029    例の場合、bufには123の文字列がコピーされる、終端は0x00で埋められる。
1030
1031 返り値
1032    書き込んだバイト数を返す。
1033
1034
1035
1036
1037
1038
1039 名前
1040    COUNT_MEMCPY2() 文字列の指定位置から指定した数だけバッファにコピーする
1041
1042 書式
1043    int count_memcpy(char[](1), char[](2), int(3));
1044    (1) char[] コピー先のバッファ、サイズチェックなしなので注意
1045    (2) char[] コピー元のバッファ
1046    (3) int 指定位置(先頭からのバイト数)
1047    (4) int (3)の位置からコピーするバイト数
1048
1049    使用例     >   ret = count_memcpy2(buf, "1234567", 3, 6);
1050
1051 説明
1052    例の場合、bufには3456の文字列がコピーされる、終端は0x00で埋められる。
1053
1054 返り値
1055    書き込んだバイト数を返す。
1056
1057
1058
1059
1060
1061
1062
1063
1064 名前
1065    DELIM_COUNT() 文字列をデリミターで区切り、指定番めの文字列の先頭位置と終端位置を返す。
1066
1067 書式
1068    int delim_count(char *(1), char(2), int(3), int *(4), int *(5));
1069    (1) char * 分割される文字列
1070    (2) char デリミター文字
1071    (3) int デリミターの位置番め
1072    (4) int * 切り出した文字列の先頭位置を返す、ポインター
1073    (5) int * 切り出した文字列の終端位置を返す、ポインター
1074
1075    使用例     >     ret = delim_count("1-23-456-789", '-', 2, &sta, &sto);
1076
1077 説明
1078    例の場合、'-'デリミタで2こ目の文字列は456になるが、この先頭位置を終端いちを
1079    それぞれ&sta, &stoに返す。
1080
1081 返り値
1082    失敗した場合は-1を返す。
1083
1084
1085
1086
1087
1088
1089 名前
1090    MEM_COUNT() 文字列に指定文字が最後に表れる場所(番め)を返す。
1091
1092 書式
1093    int mem_count(char *(1), char(2));
1094    (1) char * 検索文字列
1095    (2) char 検索文字
1096
1097    使用例    >     ret = mem_count("12-345-678", '-');
1098
1099 説明
1100    例の場合、'-'が最後に表れるのは先頭から6番めで、先頭を0とする。
1101
1102 帰り値
1103    説明に従う
1104
1105
1106
1107
1108
1109 名前
1110    MEM_TCOUNT() 文字列に指定文字が最初に表れる場所(番め)を返す。
1111
1112 書式
1113    int mem_tcount(char *(1), char(2));
1114    (1) char * 検索文字列
1115    (2) char 検索文字
1116
1117    使用例    >     ret = mem_tcount("12-345-678", '-');
1118
1119 説明
1120    例の場合、'-'が最初に表れるのは先頭から2番めで、先頭を0とする。
1121
1122 帰り値
1123    説明に従う
1124
1125
1126
1127
1128
1129
1130 名前
1131    MEMCOUNT_CPM() 文字列の指定位置を別バッファにコピーする
1132
1133 書式
1134    int memcount_cpm(char *(1), char *(2), int(3), int(4), int(5));
1135    (1) char * コピー先のバッファ。サイズ確認なしなので注意
1136    (2) char * 切り出す文字列
1137    (3) int 切り出す先頭位置
1138    (4) int 切り出す終端位置
1139    (5) 1の大きさ
1140
1141    使用例   >    ret =  memcount_cpm(buf, "0123456789", 3, 5, 8);
1142
1143 説明
1144    例の場合、先頭を0と数えるので、bufに入るのは345です。
1145
1146 返り値
1147    成功した場合はコピーした文字の数。
1148    失敗した場合は-1を返します。
1149
1150
1151
1152
1153
1154
1155 名前
1156    RM_CRLF() 文字列の中の\r\nを0x00に置き換える
1157
1158 書式
1159    int rm_crlf(char *(1), int(2));
1160    (1) char * データ文字列
1161    (2) int 上限値、通常は strlen()の値
1162
1163    使用例     >     int = rm_crlf(data, (int)strlen(data));
1164
1165 説明
1166    単純に改行コードをNULLに書き換えるので、文字列の途中にある場合は
1167    データが切断されることに注意。
1168
1169 返り値
1170    データの大きさを返します。
1171
1172
1173
1174
1175
1176 名前
1177    RM_CHAR() 文字列の中の特定の文字を消して、お尻をつめる。
1178
1179 書式
1180    int rm_char(char *(1), char(2));
1181    (1) char * データ文字列
1182    (2) char 置き換え文字
1183
1184    使用例      >    ret = rm_char(data, 'd');
1185
1186 説明
1187    文字列の中に現れる指定文字を消して、後ろからその位置に詰める。
1188    終端には0x00が入る。
1189
1190 返り値
1191    消した文字数を返す。但しバッファーの中身が無くなった場合は0を返す。
1192
1193
1194
1195
1196
1197
1198 名前
1199    SET_MEM() 文字列の中の特定の文字を0x00に置き換える
1200
1201 書式
1202    int set_mem(char *(1), char(2), int(3));
1203    (1) char * データ文字列
1204    (2) char 置き換え文字
1205    (3) int 上限値、通常はstrlen()の値
1206
1207    使用例      >    ret = set_mem(data, 'd', (int)strlen(data));
1208
1209 説明
1210    特定の文字を0x00に置き換える。文字列の途中に指定文字があると、
1211    データはそこで切断されるので注意。
1212
1213 返り値
1214    データの大きさを返す。
1215
1216
1217
1218
1219
1220
1221 名前
1222    SWAP_MEM() 特定の文字を特定の文字で置き換える
1223
1224 書式
1225    int swap_mem(char *(1), char(2), char(3));
1226    (1) char * 置き換え元の文字列
1227    (2) char 置き換えられる文字
1228    (3) char 置き換える文字
1229
1230    使用例     >    ret = swap_mem(data, 'x', 'g');
1231
1232 説明
1233    例の場合、data の中の'x'を全て 'g'に置き換える。
1234
1235 返り値
1236    置き換えた数を返します。
1237
1238
1239
1240
1241
1242
1243 名前
1244    SWAP_ARMEM() 特定の範囲の特定の文字を特定の文字で置き換える
1245
1246 書式
1247    int swap_armem(char *(1), char(2), char(3), int(4), int(5));
1248    (1) char * 置き換え元の文字列
1249    (2) char 置き換えられる文字
1250    (3) char 置き換える文字
1251    (4) int  置き換える先頭文字
1252    (5) int  置き換える終端文字
1253
1254    使用例     >    ret = swap_mem(data, 'x', 'g');
1255
1256 説明
1257    例の場合、data の中の'x'を全て 'g'に置き換える。
1258
1259 返り値
1260    置き換えた数を返します。
1261
1262
1263
1264
1265
1266 名前
1267    CHMEM() とにかく指定した数だけ0x00でうめる。
1268
1269 書式
1270    int chmem(char *(1), int);
1271    (1) char * 置き換え元の文字列
1272    (2) 置き換える文字数。
1273
1274    使用例     >    ret = chmem(data, 10);
1275
1276 説明
1277    とにかく指定した数だけ0x00でうめる。バッファの溢れは考慮しない。
1278
1279 返り値
1280    2に対して、0より少ない数を指定すると-1を返す。
1281
1282
1283
1284
1285
1286
1287
1288
1289    ----- 以下は特殊用途関数 -----
1290
1291 名前
1292    BASE64() 文字列をbase64エンコードする。
1293
1294 書式
1295    int base64(char[](1), int(2), char[](3));
1296    (1) エンコード前の文字列
1297    (2) エンコード前の文字列の大きさ
1298    (3) エンコード後の文字列の入れ先
1299
1300    使用例  >   base64(a, (int)strlen(a), b);
1301
1302 説明
1303    上の場合aを64エンコードしてbに入れる。bの大きさは最低でもaの倍ないといけない。
1304
1305 返り値
1306    現状で0しか返さない。
1307
1308
1309
1310
1311
1312 名前
1313    UJTOJ() EUC文字列をJISに変更する。
1314
1315 書式
1316    int ujtoj(unsigned char *(1), unsigned char *(2));
1317    (1) 戻りバファ、JISに変換後。
1318    (2) EUCのバファ。
1319
1320
1321    使用例  >   ujtoj((unsigned char *)out, (unsigned char *)in);
1322
1323 説明
1324    上の場合in(EUC)をout(JIS)に変換します。
1325    この関数は 「TCP_IP ネットワークプログラミング」から使わせていただいてます。
1326
1327 返り値
1328    現状で0しか返さない。
1329
1330
1331
1332
1333
1334 名前
1335    SAFE_BASE64() 文字列をbase64エンコードする。 (動的バッファ)
1336
1337 書式
1338    char * safe_base64(char *(1));
1339    (1) エンコードしたいバッファ。領域を予め動的に確保していること。
1340
1341    使用例   >  data = safe_base64(data);
1342
1343 説明
1344    予め動的に確保されたバッファにエンコードしたい文字列を入れsafe_base64()に渡すと、
1345    同じバッファにbase64エンコードされた文字列を返します。
1346    このバッファは最大で渡した文字列の倍のサイズに動的に拡張されることに注意。
1347
1348 返り値
1349    バッファのポインターを返します。
1350
1351
1352
1353
1354
1355
1356 名前
1357    SAFE_UJTOJ() EUC文字列をJISに変更する。(動的バッファ)
1358
1359 書式
1360    char * safe_ujtoj(char *(1));
1361    (1) 変換したいバファ、(EUC をJISに変換)
1362
1363    使用例  >   data = safe_ujtoj(data);
1364
1365 説明
1366    上の場合data (EUC)をdata(JIS)に変換します。
1367
1368 返り値
1369    バッファのポインターを返します。
1370
1371
1372
1373
1374
1375
1376 名前
1377    MIME_UJTOJ() EUC文字列をJISに変換しながら、76文字で折り返しMIMEに従ったsubject文字に変更する。(動的バッファ)
1378
1379 書式
1380    char * mime_ujtoj(char *(1));
1381    (1) EUC文字列バッファ。領域を予め動的に確保していること。
1382
1383    使用例  >  data = mime_ujtoj(data);
1384
1385 説明
1386    上記の場合、EUC文字列をJISに変換しながら、76文字で折り返しMIMEに従ったsubject文字に変更した値を返す。
1387
1388 返り値
1389    バッファのポインターを返します。
1390
1391
1392
1393
1394
1395 名前
1396    RANDDATA() 指定した数字の幅の中から、マイクロ秒をseedとして生成した乱数を返す。
1397
1398 書式
1399    int  randdata(int (1), int (2));
1400    (1) 生成する乱数の下限
1401    (2) 生成するランスの上限
1402
1403    使用例  >  randint = randdata(0, 10);
1404
1405 説明
1406    上記の場合、0から10の間の数字のいずれかをマイクロ秒を種として出した乱数の値で返す。
1407
1408 返り値
1409    乱数を返す。
1410
1411
1412
1413
1414 名前
1415    COUNTS() 指定した幅の数を少ない方から順番に返す。
1416
1417 書式
1418    int counts(char * (1), int (2), int(3));
1419    (1) 数を書くファイル名(デフォルトでは/tmp/taro)
1420    (2) 数の下限
1421    (3) 数の上限
1422
1423    使用例  >  back = counts("/tmp/hage", 0, 10);
1424
1425 説明
1426    上記の場合、0から10の間の数字のいずれかを少ない方から順番に返す。
1427    (1)は数を書き込んでおくファイルです。
1428
1429 返り値
1430    数を返す。
1431
1432
1433
1434
1435 名前
1436    IN_BIT() '0101'で表現された文字列(2進数)を整数に変換する。
1437
1438 書式
1439    unsigend long in_bit(char *(1), int(2));
1440    (1) '01010'で表現された文字列(2進数)
1441    (2) 文字列の幅(8文字なら8)
1442
1443    使用例
1444    unsigned int in8;
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));
1449
1450 説明
1451    上記の場合は'01010101'の文字列をin_Bit()にてin8に整数で与えている。
1452
1453 返り値
1454    整数を返す、文字列の幅と実際の文字列の長さが異なる場合は-1を返す。
1455    与えた文字列に0、1意外が含まれる場合は-2を返す。 
1456
1457
1458
1459
1460 名前
1461    OUT_BIT() 整数を'01010'で表現される文字列(2進数)に変換する。
1462
1463 書式
1464    char * out_bit(unsigned int(1), char *(2), int(3));
1465    (1) 文字列(2進数)に変換したい整数
1466    (2) 文字列を納めるバッファのポインター
1467    (3) 変換したい文字の幅
1468
1469    使用例
1470    unsigned int in8;
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));
1475
1476 説明
1477    上記の場合は一旦整数として格納した'01010101'を再度文字列に戻している。
1478    
1479 返り値
1480    格納した文字列のポインターを返す。
1481
1482
1483
1484
1485 名前
1486    SHIFT8_UPDOWN_IN() 32Bit整数を8Bitで4っに分けてそれぞれに8Bitで表現可能な数を入れる 
1487
1488 書式
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ビットで表現可能な数字
1494
1495    使用例
1496
1497    int da = shift8_updown_in(255, 0, 0, 255);
1498
1499 説明
1500    上の場合、下位8ビットに255を入れた
1501
1502 返り値
1503    上の場合、32ビットの整数で255を返す
1504
1505
1506
1507
1508
1509 名前
1510    SHIFT8_UPDOWN_OUT() 32Bit整数を8Bitで4っに分けて、それぞれの値を別に取り出す。
1511
1512 書式
1513    int = shift8_updown_out(int(1), char(2));
1514    (1) shift8_updown_in()で作った整数
1515    (2) 取り出す位置を示す文字
1516
1517    使用例
1518    int da = shift8_updown_out(shift8_updown_in(0,0,0,255), 'd');
1519
1520 説明
1521    上の場合、255を返す
1522    'd'は下位8ビット、'u'は8〜16、'm'は16〜24、't'は24〜32までに区切って返す。
1523    つまりintの整数に8ビットまでの4っの意味を持たすことが出来ます。
1524
1525 返り値
1526    上の場合、32ビットの整数で255を返す
1527    255までの整数なら、shift8_updown_out()を使う必要がない。
1528
1529
1530
1531
1532
1533 名前
1534    INITDAEMON() 自分自身をバックグランドに落し、引数の場所にchdir()する
1535
1536 書式
1537    void initdaemon(char *);
1538
1539    使用例
1540    initdaemon();
1541
1542 説明
1543    自分自身をバックグランドに落し、引数の場所にchdir()する
1544
1545 返り値
1546    なし
1547
1548
1549
1550
1551
1552 名前
1553    INITDAEMONS() 自分自身をバックグランドに落す
1554
1555 書式
1556    void initdaemon(char *);
1557
1558    使用例
1559    initdaemon();
1560
1561 説明
1562    自分自身をバックグランドに落す
1563
1564 返り値
1565    なし
1566
1567
1568
1569
1570
1571
1572 名前
1573    CONVERT() バッファーの文字列を、指定した文字コードから指定した文字コードに変換する。
1574
1575 書式
1576    char * convert(const char *, const char *, const char *, char *, size_t, int *);
1577
1578    使用例
1579    output_data = convert("UTF-8", "ISO-2002-JP", input_data, output_data, 5042, &ret);
1580
1581 説明
1582    上記の例だと、3番めの引数にあたる(input_data)に入れた文字列をUTF-8と断定して、
1583    その文字列をISO-2002-JPに書き換え、(output_data)に戻す。
1584    (output_data)の大きさは5024を越えない。
1585    retのポインターは成功は0<、失敗は-*を返します。
1586
1587 返り値
1588    戻り値はoutput_dataのポインターを返す。
1589
1590
1591
1592
1593
1594 名前
1595    SELF_CONVERT_DATA() バッファーの文字列を、指定した文字コードから指定した文字コードに変換する。文字数の制限つき。普通のバッファー用
1596
1597 書式
1598    int self_convert_data(const char *, const char *, char *, size_t);
1599
1600    使用例
1601    ret = self_convert_data("UTF-8", "ISO-2002-JP", data, 5042);
1602
1603 説明
1604    上記の例だと、3番めの引数にあたる(data)に入れた文字列をUTF-8と断定して、
1605    その文字列をISO-2002-JPに書き換え、(data)に戻す。
1606    (data)の大きさは5024を越えない。
1607
1608
1609 返り値
1610    成功は0<、失敗は-*を返します。
1611
1612
1613
1614
1615 名前
1616    SAFE_CONVERT_DATA() バッファーの文字列を、指定した文字コードから指定した文字コードに変換する。(動的バッファー)
1617
1618 書式
1619    char * safe_convert_data(const char *, const char *, char *, int *);
1620
1621    使用例
1622    ret = self_convert_data("UTF-8", "ISO-2002-JP", malloc_data, &ret);
1623
1624 説明
1625    上記の例だと、3番めの引数にあたる(data)に入れた文字列をUTF-8と断定して、
1626    その文字列をISO-2002-JPに書き換え、(data)に戻す。
1627    (data)はヒープ。
1628    retのポインターは成功は0<、失敗は-*を返します。
1629
1630
1631 返り値
1632    戻り値はoutput_dataのポインターを返す。
1633
1634
1635
1636
1637
1638
1639
1640
1641    ----- 以下は時間関係の関数リファレンス -----
1642
1643
1644
1645 名前
1646    CHAR_WDAY() 0から6の数字から3文字の曜日を示す文字列をかえす。
1647
1648 書式
1649    char * char_wday(int (1));
1650    (1) int 0から6の数字。以下は数字が示す曜日、また戻す文字列
1651            0: 日曜    Sun
1652            1: 月曜    Mon
1653            2: 火曜    Tue
1654            3: 水曜    Wed
1655            4: 木曜    Thu
1656            5: 金曜    Fri
1657            6: 土曜    Sat
1658         意外:         Not!
1659  
1660    使用例       >       char * cha = char_wday(0);
1661
1662 説明
1663    例の場合、'Sun' という文字列がかえされる。
1664
1665 返り値
1666    意外の数字を与えた場合は'Not!'が返される。
1667
1668
1669
1670
1671
1672
1673
1674 名前
1675    CHAR_MON()  0から11の数字から3文字の月を示す文字列をかえす。
1676
1677 書式
1678    char * char_mon(int (1));
1679    (1) int 0から11の数字。以下は数字が示す月、また戻す文字列
1680            0: 1月  Jan
1681            1: 2月  Feb
1682            2: 3月  Mar
1683            3: 4月  Apr
1684            4: 5月  May
1685            5: 6月  Jun
1686            6: 7月  Jul
1687            7: 8月  Aug
1688            8: 9月  Sep
1689            9: 9月  Oct
1690           10: 10月 Nov
1691           11: 11月 Dec
1692           12: 12月 Dec
1693         意外:      Not!
1694
1695    使用例       >       char * mon = char_mon(0);
1696
1697 説明
1698    例の場合、'Jan' という文字列がかえされる。
1699
1700 返り値
1701    意外の数字を与えた場合は'Not!'が返される。
1702
1703
1704
1705
1706
1707 名前
1708    UTIME_GETR() unix time からcharで指定した時間をかえす
1709
1710 書式
1711    int utime_getr(time_t(1), char(2));
1712    (1) 指定unix time 
1713    (2) 文字。以下は文字が示す属性
1714        'y': 年
1715        'm': 月
1716        'd': 日
1717        'w': 曜日(0 - 6 CHAR_WDAY() を参照)
1718        'h': 時
1719        'i': 分
1720        's': 秒
1721       意外:  0 をかえす 
1722
1723    使用例       >       int day = utime_getr((time_t)lin, 'd');
1724
1725 説明
1726    例の場合、lin という数字をUNIX TIMEに置き換えて、その時の日日を計算して整数でかえす
1727
1728 返り値
1729    意外の数字を与えた場合は0が返される。
1730
1731
1732
1733
1734
1735
1736 名前
1737    CTIME_GETR() 現在時刻の指定文字の示す時間属性をかえす */
1738
1739 書式
1740    int ctime_getr(char (1))
1741    (1) 文字。以下は文字が示す属性
1742        'y': 年
1743        'm': 月
1744        'd': 日
1745        'w': 曜日(0 - 6 CHAR_WDAY() を参照)
1746        'h': 時
1747        'i': 分
1748        's': 秒
1749       意外:  0 をかえす 
1750
1751    使用例       >       int day = ctime_getr('d');
1752
1753 説明
1754    例の場合、現在時刻の日日を整数でかえす
1755    この関数はスレッドセーフである
1756
1757 返り値
1758    数字以外を与えた場合は0が返される。
1759
1760
1761
1762
1763
1764
1765 名前
1766    TIME_PLAS() cha 単位で t 時 に mt 時間プラスした時間を返す関数 23 + 2 = 1
1767
1768 書式
1769    int time_plas(int t(1), int mt(2), char cha(3))
1770    (1) 足される時間
1771    (2) 足す時間
1772    (3) 文字。以下は文字が示す属性
1773        'h': 時 24 単位
1774        'i': 分 60 単位
1775       意外:    24 単位とする
1776
1777    使用例       >       int ha = time_plas(23, 2, 'h');
1778
1779 説明
1780    例の場合、23時に2時間足した場合の時間、1時が返る
1781    時間と分に対してしか使えない。 
1782
1783 返り値
1784    数字以外を与えた場合は0が返される。
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794 名前
1795    DAY_PLASMINUS() 一日前後の日、月、年を出す
1796
1797 書式
1798    int day_plas(int * (1), int * (2), int * (3), char(4))
1799    (1) 年 整数のポインターを渡す
1800    (2) 月 ”
1801    (3) 日 ”
1802    (4) 記号 '+' は一日プラス、'-'は一日マイナスする
1803
1804 使用例       >     day_plas(&year, &month, &day, '+');
1805
1806 説明
1807    一日後の日月年を出す、うるう年も加味している。
1808
1809 返り値
1810    間違いがあれば-1を返す。
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820 名前
1821    GET_UNIXTIME() localな時間からUNIX時間をかえす。
1822
1823 書式
1824    time_t get_unixtime(int ye(1), int mo(2), int day(3), int hour(4), int min(5), int sec(6))
1825    (1) 年 (例1970)
1826    (2) 月
1827    (3) 日
1828    (4) 時間
1829    (5) 分
1830    (6) 秒
1831    これらは0以下の場合は0に修正される
1832
1833    使用例       >      time_t tt = get_unixtime(1970, 1, 1, 1, 1, 1)
1834
1835 説明
1836    例の場合のtt は0になるはずである
1837
1838 返り値
1839    意外の数字を与えた場合は0が返される。
1840
1841
1842
1843
1844 名前
1845    MESSAGE_ID() 出きるだけユニークなメッセージIDを作ります。
1846
1847 書式
1848   char * message_id(char *(1), char *(2), char *(3));
1849   (1) データを戻したいバッファ、戻り値と同じポインターを指定、予めmallocされていること。
1850   (2) @の前に入れたい名前
1851   (3) @の後に入るドメイン
1852
1853   使用例   retp = message_id(retp, "taro", "zither.ms-n.com");
1854
1855 説明
1856   出力フォーマットは年月日時分.ランダムな数字.名前@ドメイン名
1857
1858 返り値
1859   ポインターのアドレス。
1860
1861
1862
1863
1864
1865 名前
1866    DAY_MINUS()  現在の年月で、一日前の日をかえす。(1 - 1 = 31)
1867
1868 書式
1869    int day_minus(int(1))
1870    (1) この日日から1を引いた日が返る
1871
1872    使用例       >       int a = day_minus(31);
1873
1874 説明
1875    例の場合、 aには0日が入るかもしれない
1876    うるう年や月が28日か30、31なのかの判断は現在の月から判断する。
1877
1878 返り値
1879    異常の場合は-1が返る。
1880
1881
1882
1883
1884
1885
1886
1887 名前
1888    MONTH_LAST() 何年何月の最後の日を出す
1889
1890 書式
1891    int month_last(int(1), int(2));
1892    (1) 年(例2008)
1893    (2) 月(例1)
1894
1895    使用例         >      int mo = month_last(2008, 1);
1896
1897 説明
1898    例の場合、moには2008年1月の最後の日である31が返る。うるう年も考慮される。
1899
1900 返り値
1901    異常の場合は-1が返る
1902
1903
1904
1905
1906
1907
1908
1909
1910 名前
1911    MONTH_MINUS()  指定月から一ヶ月引いた月をかえす。単純。。。
1912
1913 書式
1914    int month_minus(int(1))
1915    (1) 月(1 - 12)
1916
1917    使用例          >      int month_minus(1);
1918
1919 説明
1920    例の場合、1月の前の月は12月なので12が返る。
1921
1922 返り値
1923    異常の場合は-1が返る
1924
1925
1926
1927
1928
1929
1930
1931
1932 名前
1933    TIME_GETR() 現在時刻の:区切りの文字列をバッファにかえす。
1934
1935 書式
1936    char * time_getr(char *(1));
1937    (1) 文字列を返すバッファのポインター
1938
1939    使用例         >       char * data = time_getr(data);
1940
1941 説明
1942    例の場合、data に 2007:09:28:02:22:59 のような文字列が入る。
1943    data は予め動的に確保されている必要がある。
1944
1945 返り値
1946    失敗の場合は不明です。
1947
1948
1949
1950