/***************************************** nosprintf.c sprintf()の代わりに使える関数群 @author:金 賢鍾, 張 辰樹 修正:西崎 潤平 (2007/10/12) *****************************************/ #include "nosprintf.h" /////////////////////////////////////////////////////////// // htoa() // 整数を16進表記にして文字列に変換する // 引数: // unsigned char _far *str:変換後の文字を格納する文字列 // unsigned int hex_int_data:変換したい値 /////////////////////////////////////////////////////////// void htoa(unsigned char _far *str, unsigned int hex_int_data) { unsigned int i = 0; int a,count; int buf_data = hex_int_data; count =1; a = buf_data; while(a >= 16) //桁数の算定 { a=a/16; count = count * 16; } while( count >= 1 ) //変換 { a = buf_data / count; str[i] = a + 0x30; if (str[i] > 57) str[i] = str[i]+7; buf_data = buf_data % count; i++; count = count/16; } str[i] = '\0'; //ヌル文字を入れる return; } /////////////////////////////////////////////////////////// // itoa() // 整数を10進表記にして文字列に変換する // 引数: // unsigned char _far *str:変換後の文字を格納する文字列 // unsigned int dec_int_data:変換したい値 // unsigned char digit:桁数(0の時は自動調整) /////////////////////////////////////////////////////////// void itoa(unsigned char _far *str, int dec_int_data, unsigned char digit) { unsigned int i=0; unsigned char j; int a,count; unsigned char count2; int buf_data = dec_int_data; if(dec_int_data < 0) buf_data = -1 * dec_int_data; a = buf_data; count = 1; count2 = 1; //桁数の算定 while(a >= 10) { a=a/10; count = count * 10; count2++; } for(j = digit; j > count2; j--) { str[i++] = ' '; } //負の値の時の処理 if ( dec_int_data < 0) str[i++]='-'; //変換 while(count >= 1) { a = buf_data / count; str[i++] = a + 0x30; buf_data = buf_data % count; count = count/10; } //ヌル文字 str[i] = '\0'; } /////////////////////////////////////////////////////////// // ftoa() // 小数を文字列に変換する // 引数: // unsigned char _far *str:変換後の文字を格納する文字列 // unsigned float num:変換したい小数 // unsigned char n_o_after_point:小数点以下を何桁表示するか /////////////////////////////////////////////////////////// void ftoa(unsigned char _far * str, float num, unsigned char n_o_after_point) { unsigned char i,count; int temp_num; int dec_pd=1; //整数部 temp_num = (int)num; itoa(&str[0], temp_num, 0); for(i = 0 ; str[i]!='\0'; i++); str[i]= '.'; //小数点以下 for(count = 0 ; count < n_o_after_point ; count++) { dec_pd = dec_pd*10; } temp_num = (num - temp_num)*dec_pd; if(temp_num < 0) temp_num = -temp_num; itoa(&str[i+1], temp_num, 0); } /////////////////////////////////////////////////////////// // itoa_cat() // 整数を10進表記にして指定された文字列の最後に連結する // 引数: // unsigned char _far *str:連結したい文字列 // unsigned int dec_int_data:変換したい値 // unsigned char digit:桁数(0の時は自動調整) /////////////////////////////////////////////////////////// void itoa_cat(unsigned char _far *str, int dec_int_data, unsigned char digit) { unsigned char i; for(i = 0 ; str[i]!='\0'; i++); //ヌル文字探し itoa(&str[i], dec_int_data, digit); } /////////////////////////////////////////////////////////// // htoa_cat() // 整数を16進表記にして指定された文字列の最後に連結する // 引数: // unsigned char _far *str:連結する文字列 // unsigned int hex_int_data:変換したい値 /////////////////////////////////////////////////////////// void htoa_cat(unsigned char _far *str, unsigned int hec_int_data) { unsigned char i; for(i = 0 ; str[i]!='\0'; i++); //ヌル文字探し htoa(&str[i], hec_int_data); } /////////////////////////////////////////////////////////// // ftoa() // 小数を文字列に変換して指定された文字列の最後に連結する // 引数: // unsigned char _far *str:連結したい文字列 // unsigned float num:変換したい小数 // unsigned char n_o_after_point:小数点以下を何桁表示するか /////////////////////////////////////////////////////////// void ftoa_cat(unsigned char _far * str, float num, unsigned char n_o_after_point) { unsigned char i; for(i = 0 ; str[i]!='\0'; i++); //ヌル文字探し ftoa(&str[i], num ,n_o_after_point); } /////////////////////////////////////////////////////////// // exc_itoa() // 整数を10進表記にして文字列の指定したアドレスを一桁 // の位置基準として整数で置き換える // unsigned char _far *str:一桁が来る文字列中のアドレス // int dec_int_data:入れ替えたい10進数 /////////////////////////////////////////////////////////// void exc_itoa(unsigned char _far *str, int dec_int_data) { int a,count; int buf_data = dec_int_data; if ( buf_data < 0) { buf_data = -1 * buf_data; } count =1; a = buf_data; //一番上の桁の調べ&文字のアドレス逆移動 while(a >= 10) { a=a/10; count = count * 10; str--; //現在の文字から前の文字のアドレスに移動 } //整数が0より小さかったら-を入れる if ( dec_int_data < 0) { str--; *str = '-'; str++; } while(count >= 1) { a = buf_data / count; //その桁の数字をアスキコード変換し、データで格納 *str = a + 0x30; str++;//次の文字のアドレスに移動 buf_data = buf_data % count; count = count/10; } return; } /////////////////////////////////////////////////////////// // exc_htoa() // 整数を16進表記にして文字列の指定したアドレスを一桁 // の位置基準として整数で置き換える // unsigned char _far *str:一桁が来る文字列中のアドレス // unsigned int hex_int_data:入れ替えたい16進数 /////////////////////////////////////////////////////////// void exc_htoa(unsigned char _far *str, unsigned int hex_int_data) { int a,count; unsigned int buf_data = hex_int_data; count =1; a = buf_data; //一番上の桁の調べ&文字のアドレス逆移動 while(a >= 16) { a=a/16; count = count * 16; str--; //現在の文字から前の文字のアドレスに移動 } while(count >= 1) { a = buf_data / count; //その桁の数字をアスキコード変換し、データで格納 *str = a + 0x30; if (*str > 57) *str = *str + 7; str++;//次の文字のアドレスに移動 buf_data = buf_data % count; count = count/16; } return; } /////////////////////////////////////////////////////////// // atoi() // 文字列をint型に変換して返す. // unsigned char _far *str:変換する文字列の先頭アドレス // return answer:変換され数値化されたデータ /////////////////////////////////////////////////////////// int atoi(unsigned char *str){ int answer=0; while((*str>='0')&(*str<='9')){//文字列が数字(0以上9以下)であることを審査 answer = answer*10+(int)(*str)-(int)('0'); str++; } return answer; }