Lib/tools.h File Reference

汎用ツールヘッダ More...

#include "common.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <stdarg.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/sysinfo.h>
#include <errno.h>
#include <signal.h>
Include dependency graph for tools.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

union  unionVal
union  unionPtr
struct  ringBuffer
struct  rectAngle

Defines

#define CHAR_CR   0x0d
 改行
#define CHAR_LF   0x0a
 ラインフィード
#define CHAR_TAB   0x09
 タブ
#define CODE_US   0
#define CODE_EN   0
#define CODE_EUC   1
#define CODE_SJIS   2
#define CODE_UTF8   3
#define UNKNOWN_ENDIAN   0
#define LITTLE_ENDIAN   1234
#define BIG_ENDIAN   4321
#define PDP_ENDIAN   3412
#define mstream   ringBuffer
 バイト型 メッセージストリーム
#define LOCAL_IPv4   "127.0.0.1"
#define LOCAL_IPv6   "::1"
#define LOCAL_IPADDR   LOCAL_IPv4
#define LOCAL_IPADDR6   LOCAL_IPv6
#define freeNull(p)   {if(!isNull((void*)p)) free(p); (p)=NULL;}
#define freenull(p)   {if(!isNull((void*)p)) free(p); (p)=NULL;}
#define free_null(p)   freeNull((p))
#define _tochar(a)   (char*)(a)
#define dup_string(s)   dup_str((s))
 dup_str()
#define pack_char(s, c)   pack_char_len((s), (c), -1)
 pack_char_len()
#define htonull(s)   ntohull((s))
 Host形式からNetwork形式へ,64bit unsigned long long int データの変換 ntohull().
#define int_swap(p, s)   {int swap=(p); (p)=(s); (s)=swap;}
 データを入れ替える
#define ex_strcmp(a, b)   ex_strncasecmp((a), (b), -1)
 文字列 aの長さに合わせて比較する.大文字小文字を区別しない.一致するなら TRUE
#define random_str(n)   temp_filename(NULL, (n))
 ランダムな文字列を生成.要 free(). see temp_filename()
#define init_mstream()   init_ringBuffer()
 init_ringBuffer()
#define new_mstream(s)   new_ringBuffer((s))
 new_ringBuffer()
#define make_mstream(s)   make_ringBuffer((s))
 make_ringBuffer()
#define free_mstream(s)   free_ringBuffer((s))
 free_ringBuffer()
#define del_mstream(s)   del_ringBuffer((s))
 del_ringBuffer()
#define clear_mstream(s)   clear_ringBuffer((s))
 clear_ringBuffer()
#define set_sigseg_handler(h)   set_sigsegv_handler((h))
 set_sigsegv_handler()
#define copy_file(src, dst)   file_from_to((src), (dst), "wb")
 srcから dsへファイルをコピーする.file_from_to()
#define cat_file(src, dst)   file_from_to((src), (dst), "ab")
 srcから dstへファイルを catする. file_from_to()
#define isBigEndian   (is_big_endian())
#define isLittleEndian   (is_little_endian())
#define ntoh_st(p, s)   {if(!isBigEndian) swap_byte((void*)(p),sizeof(*(p)),(s));}
 network形式から host形式へ.構造体pに対して sバイトづつ変換.
#define hton_st(p, s)   {if(!isBigEndian) swap_byte((void*)(p),sizeof(*(p)),(s));}
 host形式から network形式へ.構造体pに対して sバイトづつ変換.
#define ntoh_ar(p, s)   {if(!isBigEndian) swap_byte((void*)(p),(s),sizeof(*(p)));}
 network形式から host形式へ.長さsバイトの配列pに対して変換
#define hton_ar(p, s)   {if(!isBigEndian) swap_byte((void*)(p),(s),sizeof(*(p)));}
 host形式から network形式へ.長さsバイトの配列pに対して変換.
#define ntoh_data(p, s, c)   {if(!isBigEndian) swap_byte((void*)(p),(s),(c));}
 network形式からhost形式へ. cバイトづつ変換する.
#define hton_data(p, s, c)   {if(!isBigEndian) swap_byte((void*)(p),(s),(c));}
 host形式から network形式へ. cバイトづつ変換する.
#define JBXL_LOG_FILE   "/var/log/jbxl.log"
 デフォルトのログファイル
#define JBXL_ERR_FILE   "/var/log/jbxl.err"
 デフォルトのエラーファイル
#define PRINT_MESG   print_message
 環境依存用の出力関数.print_message()
#define PRINT_ESC   print_escape
 環境依存用の出力関数.print_escape()
#define PRINT_INFO   print_message
 環境依存用の出力関数.print_message()
#define PRINT_WARN   print_message
 環境依存用の出力関数.print_message()
#define PRINT_ERROR   print_message
 環境依存用の出力関数.print_message()
#define DEBUG_MODE   if(DebugMode==ON)
#define NO_DEBUG_MODE   if(DebugMode==OFF)
#define DEBUG_INFO(...)   {}
 デバッグ用出力関数.コンパイル時に削除可能
#define DEBUG_WARN(...)   {}
 デバッグ用出力関数.コンパイル時に削除可能
#define DEBUG_ERROR(...)   {}
 デバッグ用出力関数.コンパイル時に削除可能
#define DEBUG_MESG(...)   {}
 デバッグ用出力関数.コンパイル時に削除可能

Functions

int isNull (void *p)
char * get_line (char *buf, int n)
 文字型データbufのバッファ内の n行目を取り出す.改行コードは削除される.要 free()
char * get_seq_data (char *buf, int *ptr)
 文字型データbufのバッファ内の 行データをシーケンシャルに取り出す.
char * awk (char *str, char cc, int n)
 ccを区切り記号として, strのバッファ内の n番目の項目を返す.要 free()
char * cawk (char *str, char cc, int n)
 連続するccを区切り記号として, strのバッファ内の 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 * 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_char_len (char *pp, char cc, int len)
 文字列の一部の先頭のcc(複数),終わりのcc(複数),CR, LF を削除.要 free()
char * pack_head_tail_char (char *pp, char cc)
 文字の先頭のcc(複数),TAB, CR, LF.終わりのcc(複数),TAB, CR, LF を削除.要 free()
char * change_esc (char *pp)
 文字列中の CR, LF を \r, \n に変換する.要 free()
char * chomp (char *str)
 最初の改行コード以降を無効にする.
char * double_bs (char *fn)
 文字列中の \ を \\に置き換えた文字列を返す.要 free()
char * numbering_name (const char *fmt, int n)
 フォーマット fmtに従って,nを含む文字列を作り出す.要 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進の文字列を整数に変換する.
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 b)
 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)列を逆順にする.
void upper_string (char *str)
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 *s1, const char *s2, int n)
 文字列 s1とs2を拡張比較する.一致するなら TRUE
int ex_strncasecmp (const char *s1, const char *s2, int n)
 文字列 s1とs2を拡張比較する.大文字小文字を区別しない.一致するなら TRUE
int ex_strnrvscmp (const char *s1, const char *s2, int n)
 文字列 s1とs2を後ろから拡張比較する.一致するなら TRUE
int ex_strncaservscmp (const char *s1, const char *s2, int n)
 文字列 s1とs2を後ろから拡張比較する.一致するなら TRUE
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()
void print_escape (const char *format, char *mesg)
 エスケープ文字を含むメッセージの出力(stderr)
void fdump (FILE *fp, unsigned char *mesg, int n)
 16進ダンプを吐き出す
void print_16x (FILE *fp, unsigned char *mesg, int n)
 16進ダンプを吐き出す(1行)
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.
int file_from_to (const char *s, const char *d, const char *mode)
 modeに従って,ファイル sを dにコピーする.
int fp_from_to (FILE *s, FILE *d, long int sz)
 ファイル sを dにコピーする.
char * get_file_name (const char *str)
 フルパスからファイル名へのポインタを取り出す.free() してはいけない.
char * get_file_extension (const char *str)
 フルパスからファイル名の拡張子へのポインタを取り出す.free() してはいけない.
char * del_file_name (const char *str)
 フルパスを書き換えてファイル名部分を削除する.free() してはいけない.
char * del_file_extension (const char *str)
 フルパスを書き換えて拡張子を削除する.free() してはいけない.
char * get_file_path (const char *str)
 ファイル名を含むパスからパスのみを生成する.strは変化しない.要 free().
char * cut_file_extension (const char *str)
 拡張子を削除したフパス名を生成する.strは変化しない.要 free().
unsigned long 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 *, int)
 /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)
 ファイルにデータを書き込む
void init_rand (void)
 /dev/urandom からデータで乱数の系列を初期化する
char * randstr (int n)
 ランダムに A-Za-z0-9 までの文字を n文字生成する.
unsigned char * randbit (int n)
 ランダムに n bitのバイナリを生成する.
unsigned char * encode_base64 (unsigned char *str, int sz)
 バイナリデータ bufを base64にエンコードする.要 free()
unsigned char * decode_base64 (unsigned char *str, int *sz)
 bufを base64からデコードする.要 free()
unsigned char * encode_base64_filename (unsigned char *str, int sz)
 バイナリデータ bufを Base64で encodeしてファイル名を作る.ただし '/' は '$' として扱う.要 free()
unsigned char * decode_base64_filename (unsigned char *str, int *sz)
 bufを Base64で decodeしてバイナリデータを取り出す.ただし '$' は '/' として扱う.要 free()
unsigned char * encode_urlenc (unsigned char *str, int sz)
 バイナリデータ bufを URLエンコードする.要 free()
unsigned char * decode_urlenc (unsigned char *str, int *sz)
 buf を URLエンコードからデコードする.要 free()
unsigned char * encode_quoted_printable (unsigned char *str, int sz)
 バイナリデータ bufを quoted printable にエンコードする.要 free()
unsigned char * decode_quoted_printable (unsigned char *str, int *sz)
 buf を quoted printableからデコードする.要 free()
unsigned char * encode_hex (unsigned char cc)
 キャラクタを16進コードの文字列に変換する.要 free()
unsigned char decode_hex (unsigned char c1, unsigned char c2)
 16進コードをキャラクタに変換する.O-9,A-F以外が指定された場合は0とみなす. 内容を書き換える.
ringBuffernew_ringBuffer (int sz)
 リングバッファを生成する.
ringBuffer init_ringBuffer (void)
 リングバッファを初期化する.
ringBuffer make_ringBuffer (int sz)
 バッファ部が存在するリングバッファを作り出す.
void del_ringBuffer (ringBuffer **pp)
 リングバッファそのものを削除する.new_ringBuffer() と対.
void free_ringBuffer (ringBuffer *pp)
 リングバッファを解放する.make_ringBuffer() と対.
void clear_ringBuffer (ringBuffer *pp)
 リングバッファのデータを削除する.
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 *ring, int pos)
 spoint 地点から pos番目のデータへの参照.posは 0から数える.spoint は変化しない.
int put_mstream (mstream *sb, unsigned char *pp)
 メッセージ(文字列)ストリーム 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 (void)
 以後 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 *,...)
 デフォルトのログファイルにデータを書き込む
void open_errfile (void)
 デフォルトのエラーファイルをオープンする
void close_errfile (void)
 デフォルトのエラーファイルをクローズする
void print_errfile (const char *,...)
 デフォルトのエラーファイルにデータを書き込む
void print_message (const char *,...)
 バッファリングなしのメッセージ出力(stderr)
void fprint_message (FILE *, const char *,...)
 バッファリングなしのメッセージ出力

Variables

int DebugMode
 ON の場合 ライブラリ全体がデバックモードであることを示す.デフォルトは OFF..
int UnitTestMode
 ユニット単体でのテストを行う場合に使用する.デフォルトは OFF.
int KanjiCode
 処理用漢字コード.CODE_US, CODE_SJIS, CODE_EDUがある.デフォルトは CODE_US.
int HostEndian
 ホストの Endian
unsigned char LocalIPNum [4]
 127.0.0.1 のバイナリ
unsigned char LocalIPNum6 [16]
 ::1 のバイナリ
FILE * FP_LogFile
FILE * FP_ErrFile

Detailed Description

Author:
Fumi.Iseki (C)
Date:
2020 10/27

Definition in file tools.h.


Define Documentation

#define _tochar (  )     (char*)(a)

Definition at line 199 of file tools.h.

Referenced by check_ldap_passwd().

#define BIG_ENDIAN   4321
#define cat_file ( src,
dst   )     file_from_to((src), (dst), "ab")

Definition at line 399 of file tools.h.

#define CHAR_CR   0x0d
#define CHAR_LF   0x0a
#define CHAR_TAB   0x09
#define clear_mstream (  )     clear_ringBuffer((s))

Definition at line 370 of file tools.h.

#define CODE_EN   0

Definition at line 86 of file tools.h.

#define CODE_EUC   1

Definition at line 87 of file tools.h.

#define CODE_SJIS   2

Definition at line 88 of file tools.h.

Referenced by kanji_convert(), and kanji_convert_Buffer().

#define CODE_US   0

Definition at line 85 of file tools.h.

#define CODE_UTF8   3

Definition at line 89 of file tools.h.

#define copy_file ( src,
dst   )     file_from_to((src), (dst), "wb")

Definition at line 398 of file tools.h.

#define DEBUG_ERROR ( ...   )     {}

Definition at line 496 of file tools.h.

#define DEBUG_INFO ( ...   )     {}

Definition at line 494 of file tools.h.

#define DEBUG_MESG ( ...   )     {}

Definition at line 497 of file tools.h.

#define DEBUG_MODE   if(DebugMode==ON)
#define DEBUG_WARN ( ...   )     {}

Definition at line 495 of file tools.h.

#define del_mstream (  )     del_ringBuffer((s))

Definition at line 369 of file tools.h.

#define dup_string (  )     dup_str((s))

Definition at line 214 of file tools.h.

#define ex_strcmp ( a,
 )     ex_strncasecmp((a), (b), -1)

Definition at line 271 of file tools.h.

Referenced by get_http_method(), and print_protocol_header().

#define free_mstream (  )     free_ringBuffer((s))

Definition at line 368 of file tools.h.

#define free_null (  )     freeNull((p))

Definition at line 197 of file tools.h.

#define freenull (  )     {if(!isNull((void*)p)) free(p); (p)=NULL;}

Definition at line 194 of file tools.h.

#define freeNull (  )     {if(!isNull((void*)p)) free(p); (p)=NULL;}
#define hton_ar ( p,
 )     {if(!isBigEndian) swap_byte((void*)(p),(s),sizeof(*(p)));}

Definition at line 407 of file tools.h.

Referenced by write_ct_file().

#define hton_data ( p,
s,
 )     {if(!isBigEndian) swap_byte((void*)(p),(s),(c));}

Definition at line 410 of file tools.h.

#define hton_st ( p,
 )     {if(!isBigEndian) swap_byte((void*)(p),sizeof(*(p)),(s));}

Definition at line 405 of file tools.h.

Referenced by write_cmn_file(), write_ct_file(), and write_ras_file_obit().

#define htonull (  )     ntohull((s))

Definition at line 251 of file tools.h.

 
#define init_mstream (  )     init_ringBuffer()

Definition at line 365 of file tools.h.

#define int_swap ( p,
 )     {int swap=(p); (p)=(s); (s)=swap;}

Definition at line 258 of file tools.h.

#define isBigEndian   (is_big_endian())

Definition at line 401 of file tools.h.

#define isLittleEndian   (is_little_endian())

Definition at line 402 of file tools.h.

#define JBXL_ERR_FILE   "/var/log/jbxl.err"

Definition at line 421 of file tools.h.

Referenced by open_errfile(), and print_errfile().

#define JBXL_LOG_FILE   "/var/log/jbxl.log"

Definition at line 420 of file tools.h.

Referenced by open_logfile(), and print_logfile().

#define LITTLE_ENDIAN   1234
#define LOCAL_IPADDR   LOCAL_IPv4

Definition at line 186 of file tools.h.

#define LOCAL_IPADDR6   LOCAL_IPv6

Definition at line 187 of file tools.h.

#define LOCAL_IPv4   "127.0.0.1"

Definition at line 184 of file tools.h.

#define LOCAL_IPv6   "::1"

Definition at line 185 of file tools.h.

#define make_mstream (  )     make_ringBuffer((s))
#define mstream   ringBuffer

Definition at line 160 of file tools.h.

#define new_mstream (  )     new_ringBuffer((s))

Definition at line 366 of file tools.h.

#define NO_DEBUG_MODE   if(DebugMode==OFF)

Definition at line 481 of file tools.h.

#define ntoh_ar ( p,
 )     {if(!isBigEndian) swap_byte((void*)(p),(s),sizeof(*(p)));}

Definition at line 406 of file tools.h.

Referenced by read_xxx_file().

#define ntoh_data ( p,
s,
 )     {if(!isBigEndian) swap_byte((void*)(p),(s),(c));}

Definition at line 409 of file tools.h.

#define ntoh_st ( p,
 )     {if(!isBigEndian) swap_byte((void*)(p),sizeof(*(p)),(s));}
#define pack_char ( s,
 )     pack_char_len((s), (c), -1)
#define PDP_ENDIAN   3412

Definition at line 97 of file tools.h.

#define PRINT_ERROR   print_message

Definition at line 456 of file tools.h.

#define PRINT_ESC   print_escape

Definition at line 453 of file tools.h.

#define PRINT_INFO   print_message

Definition at line 454 of file tools.h.

#define PRINT_MESG   print_message
#define PRINT_WARN   print_message

Definition at line 455 of file tools.h.

#define random_str (  )     temp_filename(NULL, (n))

Definition at line 333 of file tools.h.

Referenced by make_Buffer_randomstr().

#define set_sigseg_handler (  )     set_sigsegv_handler((h))

Definition at line 390 of file tools.h.

#define UNKNOWN_ENDIAN   0

Function Documentation

char* awk ( char *  buf,
char  cc,
int  n 
)

char* awk(char* buf, char cc, int n)

ccを区切り記号として, strのバッファ内の n番目の項目を返す. 返されたデータは free()する必要がある.

Parameters:
buf 操作対象文字列.
cc 区切り文字.
n 項目の指定. 1から数える.
Returns:
指定された n番目の項目の文字列.要 free
See also:
cawk()

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 }

Here is the caller graph for this function:

int bincmp ( unsigned char *  b1,
unsigned char *  b2,
int  n 
)

int bincmp(unsigned char* b1, unsigned char* b2, int n)

バイナリデータ s1と s2 nバイト比較する.

Parameters:
b1 比較するバイナリデータ1
b2 比較するバイナリデータ2
n 比較するバイト数
Return values:
0 一致する
1 一致しない
Attention:
strncmp()の戻り値の定義とは若干異なるので注意すること.

Definition at line 674 of file tools.c.

00675 {
00676     int i;
00677 
00678     if (b1==NULL || b2==NULL) return 1;
00679 
00680     for (i=0; i<n; i++) {
00681         if (b1[i]!=b2[i]) return 1;
00682     }
00683 
00684     return 0;
00685 }

char* cawk ( char *  buf,
char  cc,
int  n 
)

char* cawk(char* buf, char cc, int n)

ccを区切り記号として, strのバッファ内の n番目の項目を返す.

n は 1から数える.連続する cc(区切り)は一つの区切りとみなす. 返されたデータは free()する必要がある.

Parameters:
buf 操作対象文字列.
cc 区切り文字.
n 項目の指定.
Returns:
指定された n番目の項目の文字列.要 free.
See also:
awk()

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 }

Here is the caller graph for this function:

char* change_esc ( char *  mesg  ) 

char* change_esc(char* mesg)

文字列中の CR, LF を \r, \n に変換する. 返されたデータは free()する必要がある.

Parameters:
mesg 操作対象の文字列
Returns:
変換後の文字列.要 free

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 }

Here is the caller graph for this function:

void check_endian ( void   ) 

void check_endian(void)

大域変数 HostEndianLITTLE_ENDIANBIG_ENDIAN を設定する.

See also:
HostEndian

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 } 

Here is the call graph for this function:

Here is the caller graph for this function:

char* chomp ( char *  buf  ) 

char* chomp(char* buf)

最初の改行コード以降を無視する.最初の改行コードのある場所に '\0' を代入する.

Parameters:
[in,out] buf 改行を無効にする文字列.
Returns:
処理された 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 }

Here is the caller graph for this function:

void clear_ringBuffer ( ringBuffer rb  ) 

void clear_ringBuffer(ringBuffer* rb)

リングバッファ rb のデータをクリア(初期化)する.

Parameters:
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行と数える

Parameters:
buf 行数を数える文字列データ
Returns:
行数.

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 }

Here is the call graph for this function:

char* cut_file_extension ( const char *  str  ) 

char* cut_file_extension(const char* str)

拡張子を削除したパス名を生成する.strは変化しない.要 free.

Parameters:
str ファイルのフルパス
Returns:
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()する必要がある.

Parameters:
buf 操作対象の文字列
ls 切り出し開始の位置
le 切り出し終了の位置
Returns:
切り出した文字列.要 free

Definition at line 1352 of file tools.c.

References Max, and Min.

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 }

Here is the caller graph for this function:

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()する必要がある.

Parameters:
buf base64からデコードする文字列.
[in,out] sz in: sz デコードされたデータの長さを格納する intへのポインタ.NULLでも良い.
out: デコードされたデータのサイズ.
Returns:
base64からデコードされたデータ.要 free
    "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 }

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

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とみなす.

Parameters:
pp1 16進コードの上位4Bit. 0-9,A-F
pp2 16進コードの下位4Bit. 0-9,A-F
Returns:
指定されたASCIIコードのキャラクタ
例: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 }

Here is the caller graph for this function:

unsigned char* decode_quoted_printable ( unsigned char *  buf,
int *  sz 
)

unsigned char* decode_quoted_printable(unsigned char* buf, int* sz)

buf を quoted printableからデコードする. 返されたデータは free()する必要がある.

Parameters:
buf デコードする文字列.
[out] sz デコードされたデータの長さを格納する変数.
Returns:
デコードされたデータ

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

unsigned char* decode_urlenc ( unsigned char *  buf,
int *  sz 
)

unsigned char* decode_urlenc(unsigned char* buf, int* sz)

buf を URLエンコードからデコードする. 返されたデータは free()する必要がある.

Parameters:
buf デコードする文字列.
[out] sz デコードされたデータの長さを格納する変数.
Returns:
デコードされたデータ.要 free

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

char* del_file_extension ( const char *  str  ) 

char* del_file_extension(const char* str)

フルパスから拡張子を削除する. strの中身を書き換えて,strを返す.free() してはいけない.

Parameters:
str ファイルのフルパス
Returns:
str中のファイル名へのポインタ

Definition at line 2251 of file tools.c.

02252 {
02253     if (str==NULL) return NULL;
02254     
02255     char  cc = '.';
02256     char* path = (char*)str;
02257 
02258     int len = (int)strlen(path);
02259     int sz = len - 1;
02260     while (sz>=0 && path[sz]!=cc) sz--;
02261 
02262     if (sz<1) return path;
02263     path[sz] = '\0';
02264 
02265     return path;
02266 }

char* del_file_name ( const char *  str  ) 

char* del_file_name(const char* str)

フルパスからファイル名を削除する. strの中身を書き換えて,strを返す.free() してはいけない.

Parameters:
str ファイルのフルパス
Returns:
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()で作り出したリングバッファを削除する.

Parameters:
[in,out] rb in: 削除するリングバッファポインタへのポインタ.
out: *rb はNULLになる.
See also:
ringBuffer, new_ringBuffer()

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()する必要がある.

Parameters:
str 操作対象の文字列
Returns:
変換された文字列.失敗した場合は NULL.要 free

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型の値を取り出す.

Parameters:
ptr 変数が格納されているメモリへのポインタ
Returns:
取り出した double型の値

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 }

Here is the call graph for this function:

double double_from_little_endian ( void *  ptr  ) 

double double_from_little_endian(void* ptr)

Little Endian形式で格納されている double型の値を取り出す.

Parameters:
ptr 変数が格納されているメモリへのポインタ
Returns:
取り出した double型の値

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

char* dtostr ( double  n  ) 

char* dtostr(double n)

double型 nを文字列にして返す.

Parameters:
n 文字列に変換する値
Returns:
変換された文字列.free() してはいけない.

Definition at line 1515 of file tools.c.

References _ToSTR, and LDATA.

01516 {
01517     memset(_ToSTR, 0, LDATA);
01518     snprintf(_ToSTR, LDATA-1, "%f", n);
01519     return _ToSTR;
01520 }

char* dtostr_ts ( double  n  ) 

char* dtostr_ts(double n)

double型 nを文字列にして返す. Thread Safe

Parameters:
n 文字列に変換する値
Returns:
変換された文字列.要 free.

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 }

Here is the caller graph for this function:

char* dup_str ( char *  buf  ) 

char* dup_str(char* buf)

文字列 bufの複製を作り出す.返されたデータは free()する必要がある.

Parameters:
buf コピー元の文字列
Returns:
複製された文字列.要 free

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 }

Here is the caller graph for this function:

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()する必要がある.

Parameters:
buf base64にエンコードするデータ.
sz データの長さを示す.-1以下の場合は buf は文字列とみなす.
Returns:
base64にエンコードされた文字列.要 free
    '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 }

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

unsigned char* encode_hex ( unsigned char  cc  ) 

unsigned char* encode_hex(unsigned char cc)

キャラクタを16進コードの文字列に変換する. 返されたデータは free()する必要がある.

Parameters:
cc 変換するキャラクタ.
Returns:
新しく確保された 3byteの領域
[0] 16進コードの上位4Bit. 0-9,A-F
[1] 16進コードの下位4Bit. 0-9,A-F
[2] '\0'
Return values:
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 }

Here is the caller graph for this function:

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()する必要がある.

Parameters:
buf エンコードするデータ.
sz エンコードするデータの長さ.-1以下の場合は buf は文字列とみなす.
Returns:
エンコードされた文字列.要 free

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 }    

Here is the call graph for this function:

Here is the caller graph for this function:

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()する必要がある.

Parameters:
buf エンコードするデータ.
sz エンコードするデータの長さ.-1以下の場合は buf は文字列とみなす.
Returns:
エンコードされた文字列.要 free

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 }    

Here is the call graph for this function:

Here is the caller graph for this function:

void euc2sjis ( unsigned char *  c1,
unsigned char *  c2 
)

void euc2sjis(unsigned char *c1, unsigned char *c2)

漢字コード変換.EUC → SJIS

Parameters:
[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 }

Here is the caller graph for this function:

int ex_strncasecmp ( const char *  dat,
const char *  key,
int  len 
)

int ex_strncasecmp(const char* dat, const char* key, int len)

拡張文字比較.ケース無視.

Parameters:
dat 比べる文字列1.
key 比べる文字列2.
len 1以上 一致させる長さ.
len 0 完全一致.
len -1 dat の長さに合わせる.
len -2 key の長さに合わせる.
Return values:
TRUE 一致した
FALSE 一致しなかった

Definition at line 849 of file tools.c.

References FALSE, and TRUE.

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 }

Here is the caller graph for this function:

int ex_strncaservscmp ( const char *  dat,
const char *  key,
int  len 
)

int ex_strncaervscmp(const char* dat, const char* key, int len)

拡張文字比較.後ろから比べる.ケース無視.

Parameters:
dat 比べる文字列1.
key 比べる文字列2.
len 1以上 一致させる長さ.
len 0 完全一致.
len -1 dat の長さに合わせる.
len -2 key の長さに合わせる.
Return values:
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 }

Here is the call graph for this function:

Here is the caller graph for this function:

int ex_strncmp ( const char *  dat,
const char *  key,
int  len 
)

int ex_strncmp(const char* dat, const char* key, int len)

拡張文字比較

Parameters:
dat 比べる文字列1.
key 比べる文字列2.
len 1以上 一致させる長さ.
len 0 完全一致.
len -1 dat の長さに合わせる.
len -2 key の長さに合わせる.
Return values:
TRUE 一致した
FALSE 一致しなかった

Definition at line 812 of file tools.c.

References FALSE, and TRUE.

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 }

Here is the caller graph for this function:

int ex_strnrvscmp ( const char *  dat,
const char *  key,
int  len 
)

int ex_strnrvscmp(const char* dat, const char* key, int len)

拡張文字比較.後ろから比べる.

Parameters:
dat 比べる文字列1.
key 比べる文字列2.
len 1以上 一致させる長さ.
len 0 完全一致.
len -1 dat の長さに合わせる.
len -2 key の長さに合わせる.
Return values:
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 }

Here is the call graph for this function:

Here is the caller graph for this function:

void fdump ( FILE *  fp,
unsigned char *  mesg,
int  n 
)

void fdump(FILE* fp, unsigned char* mesg, int n)

デバッグ用 16進ダンプ出力.

mesgの nバイトを16進表示する.n<0 の場合は 文字列とみなす.

Parameters:
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 }

Here is the caller graph for this function:

unsigned char* fgets_mstream ( unsigned char *  mesg,
mstream *  sb 
)

unsigned char* fgets_mstream(unsigned char* mesg, mstream* sb)

メッセージストリームからメッセージを一行だけ取り出す.

メッセージ mesg はメッセージストリームに一旦バッファリングされ,この関数により一行ずつ読み出される.
結果が返される時,行中の改行コードは削除され,行末には必ず \0 が入る.
メッセージストリームのバッファ部が確保されていない場合は,最初に呼び出された時点で確保される.
一旦この関数を使用して,受信データをバッファリングしたら,最後まで読み取りには必ず同じストリームを使用して
この関数を呼び出さばければならない.そうで無い場合は受信データの整合性は保証されない.

Parameters:
mesg バッファに一旦格納されるメッセージ.NULLでも可.
[in] sb ストリームバッファ(リングバッファ型のストリームバッファ).
[out] sb sb->buf バッファ部が確保さえていなければ,自動的に確保される.
[out] sb sb->state JBXL_ERROR: メッセージストリーム操作中は異常な状態にある.
[out] sb sb->state JBXL_NODATA: メッセージストリーム中に有効なデータがない.return は NULL
Returns:
取り出した文字列へのポインタ

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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 を参照すること.

Parameters:
fn ファイル名
fm ファイルモード,"r","w","a".....
mode 属性.see... man 2 chmod
Return values:
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 }

Here is the call graph for this function:

Here is the caller graph for this function:

int file_exist ( const char *  fn  ) 

int file_exist(const char* fn)

指定したファイルが存在して読み込み可能であれば「真」をそうでなければ「偽」を返す.

ファイルを一度オープンして確認するので,時間が掛かる. 読み込み可能なファイルを確認するのであれば,file_size()の方が(たぶん)早い.

Parameters:
fn ファイル名
Return values:
TRUE ファイルが存在し,読みこみ可能.
FALSE ファイルが存在しないか,または読みこみ不可能.

Definition at line 2334 of file tools.c.

References FALSE, and TRUE.

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 }

Here is the caller graph for this function:

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にコピーする.

Parameters:
src コピー元(ソース)ファイル名
dst コピー先(ディスティネーション)ファイル名
mode コピー先ファイルのオープンモード.fopenに同じ."rwa"
Return values:
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 }

Here is the call graph for this function:

unsigned long file_size ( const char *  fn  ) 

unsigned long int file_size(const char* fn)

通常のファイルの大きさを返す.シンボリックリンクなどは 0.

Parameters:
fn ファイル名
Returns:
ファイルのサイズ

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 }

Here is the caller graph for this function:

float float_from_big_endian ( void *  ptr  ) 

float float_from_big_endian(void* ptr)

Big Endian形式で格納されている float型の値を取り出す.

Parameters:
ptr 変数が格納されているメモリへのポインタ
Returns:
取り出した float型の値

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 }

Here is the call graph for this function:

float float_from_little_endian ( void *  ptr  ) 

float float_from_little_endian(void* ptr)

Little Endian形式で格納されている float型の値を取り出す.

Parameters:
ptr 変数が格納されているメモリへのポインタ
Returns:
取り出した float型の値

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 }

Here is the call graph for this function:

int fp_from_to ( FILE *  src,
FILE *  dst,
long int  sz 
)

int fp_from_to(FILE* src, FILE* dst, long int sz)

ファイル srcを dstにコピーする.

Parameters:
src コピー元(ソース)のファイルポインタ
dst コピー先(ディスティネーション)のファイルポインタ
sz コピー元(ソース)のサイズ
Return values:
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_message ( FILE *  fp,
const char *  fmt,
  ... 
)

void fprint_message(FILE *fp, const char* fmt, ...)

バッファリング無しのメッセージ出力

Parameters:
fp 出力先のファイルポインタ
fmt 出力フォーマット.printf() に準拠.
See also:
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 }

Here is the caller graph for this function:

void free_ringBuffer ( ringBuffer rb  ) 

void free_ringBuffer(ringBuffer* rb)

リングバッファのバッファ部を開放する.

Parameters:
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(float n)

float型 nを文字列にして返す.

Parameters:
n 文字列に変換する値
Returns:
変換された文字列.free() してはいけない.

Definition at line 1498 of file tools.c.

References _ToSTR, and LDATA.

01499 {
01500     memset(_ToSTR, 0, LDATA);
01501     snprintf(_ToSTR, LDATA-1, "%f", n);
01502     return _ToSTR;
01503 }

char* ftostr_ts ( float  n  ) 

char* ftostr_ts(float n)

float型 nを文字列にして返す. Thread Safe

Parameters:
n 文字列に変換する値
Returns:
変換された文字列.要 free.

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 }

Here is the caller graph for this function:

char* get_file_extension ( const char *  str  ) 

char* get_file_extension(const char* str)

フルパスからファイル名の拡張子へのポインタを取り出す.

Parameters:
str ファイルのフルパス
Returns:
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 }

Here is the caller graph for this function:

char* get_file_name ( const char *  str  ) 

char* get_file_name(const char* str)

フルパスからファイル名へのポインタを取り出す. str中のポインタを返すので,free() してはいけない.

Parameters:
str ファイルのフルパス
Returns:
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 }

Here is the caller graph for this function:

char* get_file_path ( const char *  str  ) 

char* make_file_path(const char* str)

フルパスからパスを生成する.strは変化しない.要 free.

非推奨:get_file_path() を使え.

Parameters:
str ファイルのフルパス
Returns:
ファイルのフルパス(ファイル名を含まない). char* get_file_path(const char* str)

ファイルパスからパス部分のみを得る.strは変化しない.要 free.

Parameters:
str ファイルのパス
Returns:
ファイルのパス(ファイル名を含まない).最後の '/' まはた '\' 付き

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)

未使用のメモリサイズを得る.

Definition at line 3697 of file tools.c.

03698 {
03699     struct sysinfo info;
03700     sysinfo(&info);
03701 
03702     unsigned long int mem = info.freeram;
03703     return mem*info.mem_unit/1024;
03704 }

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 }

Here is the caller graph for this function:

char* get_line ( char *  buf,
int  n 
)

char* get_line(char* buf, int n)

文字型データstrのバッファ内の n行目を取り出す.改行コードは削除される.

取り出した行を char型変数のバッファに格納して返す.
バッファの最後が '\0' で終わっている場合,バッファを越えて行を読もうとした場合は NULL を返す.
'\0' で終わっていない場合,バッファが何処で終わりかを知る事は(簡単な方法では)できない.

返されたデータは free()する必要がある.

Parameters:
buf 操作対象文の字列型データ(含む改行)
n 行の指定.1 から数える.
Returns:
指定された n行目の文字列.改行は含まない.要 free

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 }

Here is the caller graph for this function:

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() してはいけない.

Returns:
"年c1月c1日c2時c3分c3秒c4" 形式のローカルタイム
    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() すること.

Returns:
"年c1月c1日c2時c3分c4秒c5" 形式のローカルタイム.要 free

Definition at line 456 of file tools.c.

00457 {
00458     char* buf = (char*)malloc(64);
00459 
00460     //struct tm tm = *gmtime(&date);
00461     struct tm tm = *localtime(&date);
00462     strftime(buf, 63, format, &tm);
00463 
00464     return buf;
00465 }

unsigned char* get_mstream ( mstream *  sb  ) 

unsigned char* get_mstream(mstream* sb)

メッセージ(文字列)ストリーム sb から次のメッセージを取り出す.改行コードは削除される.
ここで,メッセージとは \r\n, \r または \n で区切られている文字列でのことである.

Parameters:
[in] sb メッセージストリームへのポインタ
[out] sb state JBXL_NORMAL: ストリームは正常状態.JBXL_ERROR: ストリームは異常な状態にある.(未実装)
Return values:
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 }

Here is the call graph for this function:

Here is the caller graph for this function:

unsigned char* get_ringBuffer ( ringBuffer rb,
int  sz 
)

unsigned char* get_ringBuffer(ringBuffer* rb, int sz)

リングバッファ rb から szバイトのデータを取り出す.
返されたデータは free()する必要がある.

Parameters:
[in] rb リングバッファへのポインタ
[out] rb state JBXL_NORMAL: バッファは正常状態.JBXL_ERROR: バッファは異常な状態にある.
sz 取り出すバイト数.
Return values:
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 }    

Here is the caller graph for this function:

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() する必要がある.

Parameters:
[in] buf 操作対象文の字列型データ(含む改行)
[in] ptr 読み込みを開始するデータの位置(バイト).
[out] ptr 次のデータが始まる位置(バイト).
Returns:
指定されたポインタ以下の一行分の文字列.改行は含まない.要 free

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)

使用中のメモリサイズを得る.

Definition at line 3681 of file tools.c.

03682 {
03683     struct sysinfo info;
03684     sysinfo(&info);
03685 
03686     // キャッシュサイズが引けていない.
03687     unsigned long int mem = info.totalram - info.freeram - info.bufferram - info.sharedram;
03688     return mem*info.mem_unit/1024;
03689 }

unsigned char* guid2uuid ( unsigned char *  p  ) 

unsigned char* guid2uuid(unsigned char* p)

テキストのGUID をバイナリのUUID に変換する.要 free()
入力が GUIDの形式でない時は,処理結果は保証されない.

Parameters:
p テキストの GUID
Returns:
バイナリの UUIDへのポインタ.128bit. 要 free

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  ) 

int hexstr2i(const char* str)

16進数の文字列を整数に変換する.

空白は無視する.空白以外の16進数でない文字が出現したら,そこで変換を止める

Parameters:
str 整数に変換する 16進の文字列
Returns:
変換された整数

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 }

Here is the caller graph for this function:

void ignore_sigterm_child ( void   ) 

void ignore_sigterm_child()

以後 child プロセスの終了を無視する.

Definition at line 3775 of file tools.c.

03776 {    
03777     struct sigaction sa;
03778 
03779     memset(&sa, 0, sizeof(sa));
03780     sa.sa_handler = SIG_IGN;
03781     sa.sa_flags   = 0; 
03782     sigemptyset(&sa.sa_mask);
03783     sigaction(SIGCHLD, &sa, NULL);
03784 }

void init_rand ( void   ) 

void init_rand(void)

/dev/urandom から乱数の系列を初期化する

/dev/urandom が読めない場合は,呼び出された時の時間(秒数)によって乱数の系列を初期化する.

Attention:
Windows では使用できない

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 init_ringBuffer()

初期化された ringBuffer変数を返す.

Returns:
期化された ringBuffer変数
See also:
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型の値を取り出す.

Parameters:
ptr 変数が格納されているメモリへのポインタ
Returns:
取り出した int型の値

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

int int_from_little_endian ( void *  ptr  ) 

int int_from_little_endian(void* ptr)

Little Endian形式で格納されている int型の値を取り出す.

Parameters:
ptr 変数が格納されているメモリへのポインタ
Returns:
取り出した int型の値

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

int is_big_endian ( void   ) 

int is_big_endian(void)

エンディアンの動的チェック

一度呼び出すと,大域変数 HostEndianLITTLE_ENDIANBIG_ENDIAN が設定される.

Return values:
TRUE Big Endian
FALSE Little Endian
See also:
HostEndian, is_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 }

Here is the caller graph for this function:

int is_little_endian ( void   ) 

int is_little_endian(void)

エンディアンの動的チェック

一度呼び出すと,大域変数 HostEndianLITTLE_ENDIANBIG_ENDIAN が設定される.

Return values:
TRUE Little Endian
FALSE Big Endian
See also:
HostEndian, is_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 }

Here is the caller graph for this function:

int isNull ( void *  p  ) 

int isNull(void* p)

ポインタが NULLかどうかを検査する.
Windowsの場合,無効ポインタも検出する.

Parameters:
p 検査するポインタ.
Return values:
TRUE ポインタがNULL,または無効(Windowsの場合)
FALSE ポインタはNULLではなく有効(Windowsの場合)である.
Attention:
JunkBox_LIb++ の場合はこの関数ではなく,inline型の isNull() が使用される.

Definition at line 50 of file tools.c.

References FALSE, and TRUE.

00051 {
00052     if (p==NULL) return TRUE;
00053 
00054 #ifdef WIN32
00055     if (p==WIN_DD_NULL) return TRUE;
00056 #endif
00057 
00058     return FALSE;
00059 }

char* itostr ( int  n  ) 

char* itostr(int n)

int型 nを文字列にして返す.

Parameters:
n 文字列に変換する値
Returns:
変換された文字列.free() してはいけない.

Definition at line 1413 of file tools.c.

References _ToSTR, and LDATA.

01414 {
01415     memset(_ToSTR, 0, LDATA);
01416     snprintf(_ToSTR, LDATA-1, "%d", n);
01417     return _ToSTR;
01418 }

char* itostr_ts ( int  n  ) 

char* itostr_ts(int n)

int型 nを文字列にして返す.Thread Safe

Parameters:
n 文字列に変換する値
Returns:
変換された文字列.要 free.

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 }

Here is the caller graph for this function:

void kanji_convert ( unsigned char *  mesg  ) 

void kanji_convert(unsigned char* mesg)

大域変数 KnjiCodeに従って漢字コードを変換する.

Parameters:
[in,out] mesg 変換する文字列を持つ unsigned char*型データ.内容が書き換えられる.
Attention:
現在は KanjiCodeが SJISの場合のみ EUCを SJISに変換する.
See also:
KanjiCode

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 }

Here is the call graph for this function:

void kanji_convert_euc2sjis ( unsigned char *  mesg  ) 

void kanji_convert_euc2sjis(unsigned char* mesg)

EUCをSJISに変換する.

Parameters:
[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 }

Here is the call graph for this function:

Here is the caller graph for this function:

void kanji_convert_sjis2euc ( unsigned char *  mesg  ) 

void kanji_convert_sjis2euc(unsigned char* mesg)

SJISをEUCに変換する.

Parameters:
[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 }

Here is the call graph for this function:

char* lltostr ( long long int  n  ) 

char* lltostr(long long int n)

long long int型 nを文字列にして返す.

Parameters:
n 文字列に変換する値
Returns:
変換された文字列.free() してはいけない.

Definition at line 1464 of file tools.c.

References _ToSTR, and LDATA.

01465 {
01466     memset(_ToSTR, 0, LDATA);
01467     snprintf(_ToSTR, LDATA-1, "%lld", n);
01468     return _ToSTR;
01469 }

char* lltostr_ts ( long long int  n  ) 

char* lltostr_ts(long long int n)

long long int型 nを文字列にして返す.Thread Safe

Parameters:
n 文字列に変換する値
Returns:
変換された文字列.要 free.

Definition at line 1595 of file tools.c.

References LDATA.

01596 {
01597     char* str = NULL;
01598     str = (char*)malloc(LDATA);
01599     if (str==NULL) return NULL;
01600 
01601     memset(str, 0, LDATA);
01602     snprintf(str, LDATA-1, "%lld", n);
01603     return str;
01604 }

char* ltostr ( long int  n  ) 

char* ltostr(long int n)

long int型 nを文字列にして返す.

Parameters:
n 文字列に変換する値
Returns:
変換された文字列.free() してはいけない.

Definition at line 1430 of file tools.c.

References _ToSTR, and LDATA.

01431 {
01432     memset(_ToSTR, 0, LDATA);
01433     snprintf(_ToSTR, LDATA-1, "%ld", n);
01434     return _ToSTR;
01435 }

char* ltostr_ts ( long int  n  ) 

char* ltostr_ts(long int n)

long int型 nを文字列にして返す.Thread Safe

Parameters:
n 文字列に変換する値
Returns:
変換された文字列.要 free.

Definition at line 1553 of file tools.c.

References LDATA.

01554 {
01555     char* str = NULL;
01556     str = (char*)malloc(LDATA);
01557     if (str==NULL) return NULL;
01558 
01559     memset(str, 0, LDATA);
01560     snprintf(str, LDATA-1, "%ld", n);
01561     return str;
01562 }

ringBuffer make_ringBuffer ( int  sz  ) 

ringBuffer make_ringBuffer(int sz)

バッファ部が存在するリングバッファを作り出す. バッファ部は free()する必要がある.

Parameters:
sz リングバッファのバッファ部のサイズ
Returns:
作成された ringBuffer変数.バッファ部は 要 free

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() する必要がある.

Returns:
空のリングバッファ変数.要 free
See also:
ringBuffer, 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 }

Here is the call graph for this function:

Here is the caller graph for this function:

char* numbering_name ( const char *  fmt,
int  n 
)

char* numbering_name(const char* fmt, int n)

フォーマット fmtに従って,nを含む文字列を作り出す. 返されたデータは free()する必要がある.

Parameters:
fmt フォーマット用文字列.ex. "%d %f\n" see printf()
n 文字に変換する整数.
Returns:
出力された文字列.要 free
See also:
printf()

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 も削除(無視)されるので注意.

Parameters:
mesg 操作対象の文字列
cc 削除する文字
Returns:
変換後の文字列.要 free char* pack_char_len(char* mesg, char cc, int len)

文字列の一部の先頭のcc(複数),終わりのcc(複数),CR, LF を削除

タブは空白に変換.メッセージ中の連続する cc は 1個に変換. 返されたデータは free()する必要がある.

CR, LF も削除(無視)されるので注意.

Parameters:
mesg 操作対象の文字列
cc 削除する文字
len 操作する文字列の長さ
Returns:
変換後の文字列.要 free

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()する必要がある.

Parameters:
mesg 操作対象の文字列
cc 削除する文字
Returns:
変換後の文字列.要 free

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 }

Here is the caller graph for this function:

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 の場合は 文字列とみなす.

Parameters:
fp 出力するファイルへのポインタ.NULLの場合は stderr
mesg 表示するデータ.
n 表示するバイト数

Definition at line 4209 of file tools.c.

04210 {
04211     int  i, len;
04212 
04213     if (fp==NULL) fp = stderr;
04214 
04215     if (n<0) len = (int)strlen((const char*)mesg);
04216     else     len = n;
04217 
04218     for (i=0; i<len; i++) {
04219         fprintf(fp, "%02x", mesg[i]);
04220     }
04221     fprintf(fp, "\n");
04222 }

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()

Parameters:
fmt 出力フォーマット.printf() に準拠.
mesg エスケープ文字を含む文字列.
See also:
change_esc(), printf()

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 }

Here is the call graph for this function:

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)

Parameters:
fmt 出力フォーマット.printf() に準拠.
See also:
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 }

Here is the caller graph for this function:

int put_mstream ( mstream *  sb,
unsigned char *  mesg 
)

int put_mstream(mstream* sb, unsigned char* mesg)

メッセージ(文字列)ストリーム sb へメッセージ(の一部)を格納する.
ここで,メッセージとは \r\n, \r または \n で区切られている文字列でのことである.

Parameters:
[in] sb メッセージストリームへのポインタ
[out] sb state JBXL_NORMAL: ストリームは正常状態.JBXL_ERROR: ストリームは異常な状態にある.
mesg 格納するメッセージ,またはその一部
Return values:
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 }

Here is the call graph for this function:

Here is the caller graph for this function:

int put_ringBuffer ( ringBuffer rb,
unsigned char *  pp,
int  sz 
)

int put_ringBuffer(ringBuffer* rb, unsigned char* pp, int sz)

リングバッファ rb へデータを szバイト格納する.

Parameters:
[in] rb リングバッファへのポインタ
[out] rb state JBXL_NORMAL: バッファは正常状態.JBXL_ERROR: バッファは異常な状態にある.
pp 格納するデータへのポインタ.
sz 格納するデータのサイズ(Byte)
Return values:
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 }    

Here is the caller graph for this function:

unsigned char* randbit ( int  n  ) 

unsigned char* randbit(int n)

ランダムに n bitのバイナリを生成する. 返されたデータは free()する必要がある.

Parameters:
n 出力する bit数.
Returns:
ランダムに生成された n bitのデータ.要 free

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()する必要がある.

Parameters:
n 出力する文字数.
Returns:
ランダムに生成された n文字の文字列.要 free

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 }

Here is the caller graph for this function:

unsigned char* read_file ( const char *  fname,
unsigned long int *  size 
)

unsigned char* read_file(const char* fname, unsigned long int* size)

ファイルを読み込んで,データへのポインタを返す.

Parameters:
fname ファイル名
size 読み込んだデータのサイズを返す.
Returns:
読み込んだデータへのポインタ.

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

unsigned char* ref_ringBuffer ( ringBuffer rb,
int  pos 
)

unsigned char* ref_ringBuffer(ringBuffer* rb, int pos)

リングバッファ rb の spoint + pos の位置にあるデータへの参照.

Parameters:
rb リングバッファへのポインタ
pos 参照するデータの spoint からの位置.
Return values:
参照データへのポインタ. 

Definition at line 3429 of file tools.c.

References ringBuffer::buf, ringBuffer::bufsz, ringBuffer::datasz, and ringBuffer::spoint.

03430 {
03431     unsigned char* pp;
03432 
03433     if (rb==NULL) return NULL;
03434     if (rb->buf==NULL) return NULL;
03435     if (pos>rb->datasz) return NULL;
03436 
03437     int sz = rb->spoint + pos;
03438     pp = rb->buf + sz;
03439     if (sz >= rb->bufsz) pp -= rb->bufsz;
03440 
03441     return pp;
03442 }    

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の内容は変化しない.

Parameters:
[in] buf 操作対象の文字列
[out] buf 変換された文字列
len bufの領域の大きさ(長さ)'\0'を含む
frm 変換する文字列
tos 変換後の文字列
Returns:
buf へのポインタ.失敗した場合は NULL.freeしてはいけない.

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 }

Here is the caller graph for this function:

void reverse_str ( uByte p,
int  s 
)

void reverse_str(uByte* p, int s)

バイト列を逆順にする.

Parameters:
[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 }   

Here is the caller graph for this function:

int seek_ringBuffer ( ringBuffer rb,
int  sz 
)

int seek_ringBuffer(ringBuffer* rb, int sz)

リングバッファ rb の読み取り開始ポインタ spoint を sz 移動させる.

Parameters:
rb リングバッファへのポインタ
sz 開始ポインタを移動させる量.負数(バック)も可.
Returns:
TRUE : 移動に成功.
FALSE : 移動に失敗.
Bug:
バッファ長を超える移動はできない.移動させた先にデータが存在しているかは保障されない.

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() を使用.

Parameters:
(*handler)() セグメンテーションエラー時に呼び出される関数へのポインタ
See also:
trap_segmentation_falt()

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 }

Here is the call graph for this function:

void set_sigterm_child ( void(*)(int)  handler  ) 

void set_sigterm_child(void (*handler)(int))

child プロセス終了時の処理を設定.

Parameters:
(*handler)() チャイルドプロセス終了時に呼び出される関数へのポインタ@ NULL の場合は void sigterm_child(int signal) が設定される.
Attention:
シグナル関係の関数は Windowsでは使用できない

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 }

Here is the call graph for this function:

short short_from_big_endian ( void *  ptr  ) 

short short_from_big_endian(void* ptr)

Big Endian形式で格納されている short int型の値を取り出す.

Parameters:
ptr 変数が格納されているメモリへのポインタ
Returns:
取り出した short int型の値

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 }

Here is the call graph for this function:

short short_from_little_endian ( void *  ptr  ) 

short short_from_little_endian(void* ptr)

Little Endian形式で格納されている short int型の値を取り出す.

Parameters:
ptr 変数が格納されているメモリへのポインタ
Returns:
取り出した short int型の値

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 }

Here is the call graph for this function:

void sigterm_child ( int  signal  ) 

void sigterm_child(int signal)

child プロセス終了時の処理

Parameters:
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 }

Here is the caller graph for this function:

void sjis2euc ( unsigned char *  c1,
unsigned char *  c2 
)

void sjis2euc(unsigned char *c1, unsigned char *c2)

漢字コード変換.SJIS → EUC

Parameters:
[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 }

Here is the caller graph for this function:

char* skip_char ( char *  pp,
char  cc 
)

char* skip_char(char* pp, char cc)

文字列 pp の中で,次の cc までポインタをスキップさせる.
ただし," ", ' ' 内に該当文字があった場合,それらは無視される.

Parameters:
pp 文字列の先頭ポインタ
cc スキップする文字を格納した文字列.
Returns:
check[]の中で最初に見つかった文字へのポインタ.

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' へのポインタを返す.

Parameters:
pp 操作対象の文字列
pair ペアとなる最初の文字
end ペアとなる最後の文字
Returns:
ペアとなった最後の文字へのポインタ
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 }

Here is the caller graph for this function:

char* skip_chars ( char *  pp,
const char *  check 
)

char* skip_chars(char* pp, const char* check)

ppの指す文字列中で,check[]に格納されたいずれかの文字までポインタをスキップさせる.
ただし," ", ' ' 内に該当文字があった場合,それらは無視される.

Parameters:
pp 文字列の先頭ポインタ
check スキップする文字を格納した文字列.
Returns:
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 }

Here is the caller graph for this function:

char* skip_string_end ( char *  pp  ) 

char* skip_string_end(char* pp)

文字列の最後までポインタをスキップする.
ppの指す文字列 "〜" または '〜' の最後の クォーテーションへのポインタ

Parameters:
pp 文字列の先頭の クォーテーションへのポインタ
Returns:
文字列の最後の クォーテーションへのポインタ

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 }

Here is the caller graph for this function:

int strncaservscmp ( const char *  s1,
const char *  s2,
int  n 
)

int strncaservscmp(const char* s1, const char* s2, int n)

文字列 s1と s2を後ろから n文字比較する.

Return values:
0 一致する
1 一致しない
Attention:
strncmp()の戻り値の定義とは若干異なるので注意すること.

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 }

Here is the caller graph for this function:

int strnrvscmp ( const char *  s1,
const char *  s2,
int  n 
)

int strnrvscmp(const char* s1, const char* s2, int n)

文字列 s1と s2を後ろから n文字比較する.

Return values:
0 一致する
1 一致しない
Attention:
strncmp()の戻り値の定義とは若干異なるので注意すること.

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 }

Here is the caller graph for this function:

char* strstrcase ( const char *  buf,
const char *  nd 
)

char* strstrcase(const char* buf, const char* nd)

文字列 bufの中に部分文字列 ndがあるかどうかをチェックする.大文字小文字を区別しない.

大文字小文字を区別しない点を除けば,strstr() と同じ.
つまり strcasestr() と同じ.標準で strcasestr()が存在しない場合に使用.

Parameters:
buf 検索対象の文字列
nd 検索する部分文字列
Returns:
部分文字列の開始を指すポインタ.部分文字列が見つからない場合は NULL
See also:
strstr(), strcasestr()

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

void swap_byte ( void *  p,
int  s,
int  c 
)

void swap_byte(void* p, int s, int c)

上位バイトと下位バイトを逆順にする.

pが指す長さ sのデータを cバイトづつ逆順にする.

Parameters:
[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 }

Here is the call graph for this function:

int swapl ( unsigned int  p  ) 

int swapl(unsigned int p)

int型 32bit pを8bitづつ逆順にする

ntohl(), htonl()の代替関数.Windows用.

Parameters:
p 入れ替える値
Returns:
処理後の値

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 }

Here is the caller graph for this function:

short swaps ( unsigned short  p  ) 

short swaps(unsigned short p)

short型(16bit)pの上下8bitを入れ替える. ntohs(), htons()の代替関数.Windows用.

Parameters:
p 入れ替える値
Returns:
処理後の値

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 }

Here is the caller graph for this function:

char* temp_filename ( const char *  dir,
int  flen 
)

char* temp_filename(const char* dir, int flen)

/dev/urandom を利用して作業用ファイルのランダムなファイル名を得る.

/dev/urandom が読めない場合は randstr() を利用する. 返されたデータは free()する必要がある.

Parameters:
dir 作業ファイルを作るディレクトリ
flen 生成するファイル名の長さ
Returns:
作業用ファイル名のフルパス.要 free

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

void trap_segmentation_falt ( int  signal  ) 

void trap_segmentation_falt(int signal)

セグメンテーションエラー時にデフォルトで呼び出される関数.

Parameters:
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 }

Here is the caller graph for this function:

unsigned int uint_from_big_endian ( void *  ptr  ) 

unsigned int uint_from_big_endian(void* ptr)

Big Endian形式で格納されている unsigned int型の値を取り出す.

Parameters:
ptr 変数が格納されているメモリへのポインタ
Returns:
取り出した unsigned int型の値

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 }

Here is the call graph for this function:

unsigned int uint_from_little_endian ( void *  ptr  ) 

unsigned int uint_from_little_endian(void* ptr)

Little Endian形式で格納されている unsigned int型の値を取り出す.

Parameters:
ptr 変数が格納されているメモリへのポインタ
Returns:
取り出した unsigned int型の値

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 }

Here is the call graph for this function:

char* ulltostr ( unsigned long long int  n  ) 

char* ulltostr(unsigned long long int n)

unsigned long long int型 nを文字列にして返す.

Parameters:
n 文字列に変換する値
Returns:
変換された文字列.free() してはいけない.

Definition at line 1481 of file tools.c.

References _ToSTR, and LDATA.

01482 {
01483     memset(_ToSTR, 0, LDATA);
01484     snprintf(_ToSTR, LDATA-1, "%llu", n);
01485     return _ToSTR;
01486 }

char* ulltostr_ts ( unsigned long long int  n  ) 

char* ulltostr_ts(unsigned long long int n)

unsigned long long int型 nを文字列にして返す. Thread Safe

Parameters:
n 文字列に変換する値
Returns:
変換された文字列.要 free.

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 }

Here is the caller graph for this function:

char* ultostr ( unsigned long int  n  ) 

char* ultostr(unsigned long int n)

unsigned long int型 nを文字列にして返す.

Parameters:
n 文字列に変換する値
Returns:
変換された文字列.free() してはいけない.

Definition at line 1447 of file tools.c.

References _ToSTR, and LDATA.

01448 {
01449     memset(_ToSTR, 0, LDATA);
01450     snprintf(_ToSTR, LDATA-1, "%lu", n);
01451     return _ToSTR;
01452 }

char* ultostr_ts ( unsigned long int  n  ) 

char* ultostr_ts(unsigned long int n)

unsigned long int型 nを文字列にして返す.Thread Safe

Parameters:
n 文字列に変換する値
Returns:
変換された文字列.要 free.

Definition at line 1574 of file tools.c.

References LDATA.

01575 {
01576     char* str = NULL;
01577     str = (char*)malloc(LDATA);
01578     if (str==NULL) return NULL;
01579 
01580     memset(str, 0, LDATA);
01581     snprintf(str, LDATA-1, "%lu", n);
01582     return str;
01583 }

void upper_string ( char *  str  ) 

void upper_string(char* str)

str中の小文字を大文字に変換する

Parameters:
[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 }

Here is the caller graph for this function:

unsigned short ushort_from_big_endian ( void *  ptr  ) 

unsigned short ushort_from_big_endian(void* ptr)

Big Endian形式で格納されている unsigned short int型の値を取り出す.

Parameters:
ptr 変数が格納されているメモリへのポインタ
Returns:
取り出した unsigned short int型の値

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 }

Here is the call graph for this function:

unsigned short ushort_from_little_endian ( void *  ptr  ) 

unsigned short ushort_from_little_endian(void* ptr)

Little Endian形式で格納されている unsigned short int型の値を取り出す.

Parameters:
ptr 変数が格納されているメモリへのポインタ
Returns:
取り出した unsigned short int型の値

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 }

Here is the call graph for this function:

unsigned char* uuid2guid ( unsigned char *  p  ) 

unsigned char* uuid2guid(unsigned char* p)

バイナリの UUID を テキストのGUIDに変換する.要 free()

Parameters:
p バイナリの UUID. 128bit
Returns:
テキストの GUID. 要 free

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 }

Here is the caller graph for this function:

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)

ファイルにデータを書き込む

Parameters:
fname ファイル名.
buf 書き込むデータへのポインタ.
size 読み込んだデータのサイズを返す.
Returns:
実際に書き込んだデータサイズ

Definition at line 2493 of file tools.c.

02494 {
02495     if (size==0) return 0;
02496 
02497     FILE* fp  = fopen(fname, "wb");
02498     if (fp==NULL) return 0;
02499 
02500     size = (long int)fwrite(buf, size, 1, fp);
02501     fclose(fp);
02502 
02503     return size;
02504 }


Variable Documentation

int DebugMode

Definition at line 18 of file tools.c.

FILE* FP_ErrFile

Definition at line 3865 of file tools.c.

FILE* FP_LogFile

Definition at line 3864 of file tools.c.

int KanjiCode

Definition at line 21 of file tools.c.

Referenced by kanji_convert(), and kanji_convert_Buffer().

unsigned char LocalIPNum[4]

Definition at line 25 of file tools.c.

unsigned char LocalIPNum6[16]

Definition at line 26 of file tools.c.

Definition at line 19 of file tools.c.


Generated on 15 Nov 2023 for JunkBox_Lib by  doxygen 1.6.1