www.pudn.com > usbhost_source.rar > UT.C
/** * ut.c * サブルーチン集 * Copyright (c)2002 Junichi Tomaru */ #include#include #include #include "ut.h" const char hexnum[] = "0123456789ABCDEF"; /** * 数値を16進文字列に(unsigned char) */ char *uctoahz( byte num, char *buf ) { *( buf + 0 ) = hexnum[(num>>4)&0xf]; *( buf + 1 ) = hexnum[num&0xf]; *( buf + 2 ) = '\0'; return buf; } /** * 数値を10進文字列に(unsigned char) */ char *uctoaz( byte num, char *buf ) { byte n; char i, p, f; for( n = 100, p = f = 0; n > 1; n /= 10 ){ i = num / n; num %= n; if(( f == 0 ) && ( i != 0 )){ f = 1; } if( f == 1 ){ *( buf + p ) = ( char )( i + 0x30 ); p++; } } *( buf + p ) = num + 0x30; *( buf + p + 1 ) = '\0'; return buf; } /** * 数値を10進文字列に(unsigned char,ゼロサプレスしない) */ char *uctoa( byte num, char *buf ) { byte n; char i, p; for( n = 100, p = 0; n > 1; n /= 10 ){ i = num / n; num %= n; *( buf + p ) = ( char )( i + 0x30 ); p++; } *( buf + p ) = num + 0x30; *( buf + p + 1 ) = '\0'; return buf; } /** * 数値を16進文字列に(unsigned short) */ char *utoahz( word num, char *buf ) { int i; for( i = 0; i < 4; i++ ){ *( buf + i ) = hexnum[(num>>(4*(3-i)))&0xf]; } *( buf + 4 ) = '\0'; return buf; } /** * 数値を16進文字列に(unsigned long) */ char *ultoahz( dword num, char *buf ) { int i; for( i = 0; i < 8; i++ ){ *( buf + i ) = hexnum[(num>>(4*(7-i)))&0xf]; } *( buf + 8 ) = '\0'; return buf; } /** * 数字をアスキー文字列に(unsigned short) */ char *utoaz( word num, char *buf ) { word n; int i, p; for( n = 10000U, p = 0; n > 1; n /= 10, p ++ ){ i = num / n; num %= n; *( buf + p ) = ( char )( i + 0x30 ); } *( buf + p ) = num + 0x30; *( buf + p + 1 ) = '\0'; return buf; } /** * 数字をアスキー文字列に(unsigned short,ゼロサプレス) */ char *utoa( word num, char *buf ) { word n; int i, p, f; for( n = 10000U, p = f = 0; n > 1; n /= 10 ){ i = num / n; num %= n; if(( f == 0 ) && ( i != 0 )){ f = 1; } if( f == 1 ){ *( buf + p ) = ( char )( i + 0x30 ); p++; } } *( buf + p ) = num + 0x30; *( buf + p + 1 ) = '\0'; return buf; } /** * 数字をアスキー文字列に(signed short) */ char *itoaz( int num, char *buf ) { int p; p = 0; if( num < 0 ){ num = _abs( num ); *buf = '-'; p ++; } utoaz(( word )num, buf + p ); return buf; } /** * 数字をアスキー文字列に(unsigned long) */ char *ultoaz( dword num, char *buf ) { dword n; int i, p; for( n = 1000000000LU, p = 0; n > 1; n /= 10, p ++ ){ i = num / n; num %= n; *( buf + p ) = ( char )( i + 0x30 ); } *( buf + p ) = num + 0x30; *( buf + p + 1 ) = '\0'; return buf; } /** * 数字をアスキー文字列に(signed long) */ char *ltoaz( long num, char *buf ) { int p; p = 0; if( num < 0L ){ num = _abs( num ); *buf = '-'; p ++; } ultoaz(( dword )num, buf + p ); return buf; } /** * パックドBCDをアンパックドBCDに * l:パックドBCD配列の桁数 */ char *pbcd2bcd( char *pbcd, char *bcd, int l ) { int i; for( i = 0; i < l; i ++ ){ *( bcd + i * 2 ) = ( *( pbcd + i ) >> 4 ) & 0xf; *( bcd + i * 2 + 1 ) = *( pbcd + i ) & 0xf; } return bcd; } /** * アンパックドBCDをパックドBCDに * l:アンパックドBCD配列の桁数 */ char *bcd2pbcd( char *bcd, char *pbcd, int l ) { int i, j; for( i = 0; i < l; i ++ ){ j = i / 2; if(( i % 2 ) == 0 ){ *( pbcd + j ) = ( *( bcd + i ) << 4 ) & 0xf0; } else{ *( pbcd + j ) |= *( bcd + i ) & 0xf; } } return pbcd; } /** * アンパックドBCDを文字列に */ char *bcd2str( char *bcd, char *str, int l ) { int i; for( i = 0; i < l; i ++ ){ *( str + i ) = *( bcd + i ) + 0x30; } *( str + l ) = '\0'; return str; } /** * ipアドレス文字列をlong型に変換する * input parameter * adrstr "192.168.1.100" * 文字列に数字とドット以外含むことはできない * output parameter * 変換後のアドレス * "192.168.1.100" --> 0xc0a80164 * エラーの場合0x00000000を返す */ dword ipstr2bin( char *adrstr ) { char c, *p, ct, tmp[4]; int i; dword ret, pa; ret = 0; p = adrstr; ct = 0; for( i = 0; i < 16; i++ ){ c = *( p + i ); tmp[ct] = c; if( c == '.' ){ tmp[ct] = '\0'; pa = atol( tmp ); ret |= ( dword )( pa & 0xff ); ret <<= 8; ct = 0; } else if( c == '\0' ){ tmp[ct] = '\0'; pa = atol( tmp ); ret |= ( dword )( pa & 0xff ); break; } else if( isdigit( c ) == 0 ){ ret = 0; break; } else{ ct++; } } return ret; } /** * IPアドレスを文字列にする */ char *long2ipstr( dword ipadr, char *buf ) { ul_t tmp; char *p; tmp.data = ipadr; uctoaz( tmp.bytes.hh, buf ); strcat( buf, "." ); p = strrchr( buf, '.' ); uctoaz( tmp.bytes.hl, p + 1 ); strcat( buf, "." ); p = strrchr( buf, '.' ); uctoaz( tmp.bytes.lh, p + 1 ); strcat( buf, "." ); p = strrchr( buf, '.' ); uctoaz( tmp.bytes.ll, p + 1 ); return buf; } /** * 指定バイト分の比較 */ bool bytecomp( const byte *src, const byte *dest, unsigned int size ) { int i; for( i = 0; i < size; i++ ){ if( src[i] != dest[i] ){ return TRUE; } } return FALSE; } /** * 指定数分データをコピーする */ void packet_copy( char *dst, const char *src, unsigned int size ) { unsigned int i; for( i = 0; i < size; i++ ){ dst[i] = src[i]; } } /** * 指定場所に指定分だけデータを格納する */ void packet_set( char *dst, byte val, unsigned int count ) { unsigned int i; for( i = 0; i < count; i++ ){ *( dst + i ) = val; } } /** * バッファから4バイト取り出す */ dword getlongvalue( byte *buf, int offset ) { ul_t ret; ret.bytes.hh = *( buf + offset ); offset++; ret.bytes.hl = *( buf + offset ); offset++; ret.bytes.lh = *( buf + offset ); offset++; ret.bytes.ll = *( buf + offset ); return ret.data; } /** * バッファから3バイト取り出す */ dword getthreevalue( byte *buf, int offset ) { ul_t ret; ret.bytes.hh = 0; ret.bytes.hl = *( buf + offset ); offset++; ret.bytes.lh = *( buf + offset ); offset++; ret.bytes.ll = *( buf + offset ); return ret.data; } /** * バッファから2バイト取り出す */ word getwordvalue( byte *buf, unsigned int offset ) { ui_t ret; ret.bytes.hi = *( buf + offset ); offset++; ret.bytes.lo = *( buf + offset ); return ret.data; } /** * バッファに4バイトのデータを書く */ void setlongvalue( byte *buf, int offset, dword val ) { ul_t tmp; byte *p; tmp.data = val; p = buf + offset; *p = tmp.bytes.hh; p++; *p = tmp.bytes.hl; p++; *p = tmp.bytes.lh; p++; *p = tmp.bytes.ll; } /** * バッファに3バイトのデータを書く */ void setthreevalue( byte *buf, int offset, dword val ) { ul_t tmp; byte *p; tmp.data = val; p = buf + offset; *p = tmp.bytes.hl; p++; *p = tmp.bytes.lh; p++; *p = tmp.bytes.ll; } /** * バッファに2バイトのデータを書く */ void setwordvalue( byte *buf, int offset, word val ) { ui_t tmp; byte *p; tmp.data = val; p = buf + offset; *p = tmp.bytes.hi; p++; *p = tmp.bytes.lo; } /** * データを2バイトずつ加算する。 * チェックサムの計算時などに用いる。 */ dword data_add( byte *addr, unsigned int size, dword init ) { word i; dword ret; for( i = 0, ret = init; size > 1; addr += 2, size -= 2 ){ /* 2バイトずつ加算 */ ret += (( dword )( *addr ) << 8 ) + *( addr + 1 ); if( ret >= 0x10000 ){ /* オーバーしたら */ ret &= 0xffff; ret++; /* キャリ分を足す */ } } if( size == 1 ){ /* 奇数バイトのとき */ ret += (( dword )( *addr ) << 8 ); /* 1バイト分だけ足す */ if( ret >= 0x10000 ){ /* オーバーしたら */ ret &= 0xffff; ret++; /* キャリ分を足す */ } } return ret; } /** * 1の補数によるチェックサム計算ルーチン(=2の補数の加算+キャリ) * addr: 開始アドレス * size: 長さ(バイト単位) * init: 加算初期値(擬似ヘッダ部分だけ計算したものを入れる。他のときは0を入れる。) * flg: フラグ(CHECK:チェックサム検証時 MAKE:チェックサム作成時) * return: 計算結果 */ unsigned int checksum( byte *addr, unsigned int size, dword init, char flg ) { word sum; dword tmp; tmp = data_add( addr, size, init ); /* データの加算 */ sum = ( ~tmp ) & 0xffff; /* 反転 */ if(( flg == SUM_MAKE ) && ( sum == 0 )){ /* 計算結果が0のときはFFFFにする */ sum = 0xffff; } return sum; } /** * HTTP文字列内のCGI部分に特定の文字列が含まれているか調べる。 * この検索の有効範囲は"HTTP/"までである。 * input * buffer : 文字列(HTML文字列) * cmp : 文字列(検索する文字列) * output * 1 : 含まれている * 0 : 含まれていない */ char searchvalue( char *buffer, char *cmp ) { char c1, c2, *p; int i, j, k; p = strstr( buffer, "HTTP/" ); *p = '\0'; j = strlen( buffer ); k = strlen( cmp ); if( k > j ){ return 0; } for( i = k = 0; i < j; i++ ){ c1 = *( buffer + i ); c2 = *( cmp + k ); if( c1 == c2 ){ if( *( cmp + k + 1 ) == '\0' ){ return 1; } else{ k++; } } else{ k = 0; } } return 0; } /* end of ut.c */