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 */