この間はどうもありがとうございました。
無事に組めました。
今回はfreadで一定数読み込んでみようと思いやっているのですが、読み込むサイズを変えるとうまくいきません。
他にいい考え方があるならおしえてください。
void Dump( FILE *p_fp, int *p_dataelem, int *p_bufelem, int *p_loadsize, int *p_num, int *p_offset, int *p_addr, int *p_mode, unsigned char *p_data, char *p_buf )
{
int i = 0;
int codesize = 0;
if( *p_num == 0 ){
// 一定数読み込む
*p_loadsize = fread( p_data, 1, 50, p_fp );
}
// 文字サイズを取得する
codesize = GetStringSize( p_fp, p_dataelem, p_bufelem, p_num, p_offset, p_loadsize, p_data, p_buf+*p_offset );
// 文字コードの数分だけ処理する
for( i = 0; i < codesize; i++ ){
// 16進データの表示
// 先頭ならアドレスを表示
if( *p_offset==0 ) {
printf("%08lX ", *p_addr);
}
// 16進の表示
printf( "%02X ", p_data[*p_dataelem] );
// アドレスとオフセット
*p_offset+=1;
*p_addr+=1;
*p_dataelem+=1;
*p_num+=1;
// 改行位置ならテキストを表示
if( *p_offset >= 16 ){
//
*p_offset -= 16;
// テキストを表示
printf( " %s\n", p_buf );
// 行をまたがるコードなら
if(( i == 0 ) && ( codesize == 2 )){
// 先頭の文字コードは表示不可とする。
p_buf[0] = ' ';
p_buf[1] = '\0';
}else{
// テキストバッファを先頭に
p_buf[0] = '\0';
}
}
}
// 表示した数がロードした数より大きければ
if( *p_num >= *p_loadsize ){
*p_num = 0;
*p_dataelem = 0;
// 保存されていれば全角文字の1バイト目で終わっていることになる
if( p_savei == 1 ){
p_prei = p_savei;
}
// ファイルの終端なら
if( feof(p_fp)){
// ファイル名入力モードにする
*p_mode = 0;
// データがあるなら
if( *p_offset > 0 ) {
for( ; *p_offset < 16; *p_offset+=1 ){
printf(" ");
}
printf( " %s\n", p_buf );
}
}
}
}
/** 文字のサイズを取得する
* @param *fp : ファイルポインター
*/
int GetStringSize( FILE *fp, int *p_dataelem, int *p_bufelem, int* p_num, int *p_offset, int *p_loadsize, unsigned char *p_data, char *p_buf )
{
int codesize = 0; // 文字コードのサイズ
int i = 0;
// 最大2バイト
for( i = p_prei; i < 2; i++ ){
// 文字コードサイズを1増やす
codesize = i+1;
// 2バイト目の処理
SecondByte( p_dataelem, p_bufelem, p_offset, i, p_data, p_buf );
// 1バイト目の処理
if( FirstByte( p_dataelem, p_bufelem, p_num, p_offset, p_loadsize, i, p_data, p_buf ) ){ break; }
// 文字列終端
p_buf[i+1] = '\0';
}
if( p_prei == 1 ){
p_prei = 0;
p_savei = 0;
// 文字コードサイズを返す
return codesize-1;
}
// 文字コードサイズを返す
return codesize;
}
/** 1バイト目の文字の処理
*/
int FirstByte( int *p_dataelem, int *p_bufelem, int* p_num, int *p_offset, int *p_loadsize, int i, unsigned char *p_data, char *p_buf )
{
// 1バイト目なら
if( i == FIRSTBYTE ){
// 全角文字か調べる
if( ChekFullWidth( p_dataelem, p_data ) ){
// 一定のデータ数の一番最後なら
if( *p_num >= *p_loadsize-1 ){
// 現在のiを保存
p_savei = i+1;
ts[0] = p_data[*p_dataelem];
return 1;
}
// 全角文字の1バイト目
p_buf[i] = p_data[*p_dataelem];
// 次の要素へ
*p_dataelem+=1;
}else{
// 半角文字なら
if( CheckHalfSize( p_dataelem, p_data ) ){
// そのまま
p_buf[i] = p_data[*p_dataelem];
}else{
// 表示不可
p_buf[i] = '.';
}
// 文字列終端
p_buf[i+1] = '\0';
// 1バイト目はここで終了
return 1;
}
}
return 0;
}
/** 2バイト目の文字の処理
*/
void SecondByte( int *p_dataelem, int *p_bufelem, int *p_offset, int i, unsigned char *p_data, char *p_buf )
{
// 2バイト目なら
if( i == SECONDBYTE ){
// 2バイト目のコードが正しければ
if( CheckSecondByteFullWidth( p_dataelem, p_data ) ){
if( p_prei == 0 ){
// 2バイト目の文字
p_buf[i] = p_data[*p_dataelem];
// 要素を1つ戻す
*p_dataelem-=1;
}else{
*p_offset-=1;
ts[1] = p_data[*p_dataelem];
p_buf[0] = ts[0];
p_buf[i] = ts[1];
}
}else{
// 1つ前は全角ではないので.を代入
p_buf[i-1] = '\0';
// 半角文字コード
if( CheckHalfSize( p_dataelem, p_data ) ){
// そのまま
p_buf[i] = p_data[*p_dataelem];
}else{
// 表示不可
p_buf[i] = '.';
}
}
}
}
/** 半角文字か調べる
* @param data : 文字データ
* @return 1 : 半角文字
* @return 0 : それ以外
*/
int CheckHalfSize( int *p_dataelem, unsigned char *p_data )
{
if((( 0x20 <= p_data[*p_dataelem] ) && ( p_data[*p_dataelem] <= 0x7E )) || (( 0xA1 <= p_data[*p_dataelem] ) && ( p_data[*p_dataelem] <= 0xDF ))){
return 1;
}
return 0;
}
/** 2バイト目が全角文字の2バイト目か調べる
* @param data : 文字データ
* @return 1 : 2バイト目は全角文字の2バイト目
* @return 0 : それ以外
*/
int CheckSecondByteFullWidth( int *p_dataelem, unsigned char *p_data )
{
if((( 0x40 <= p_data[*p_dataelem] ) && ( p_data[*p_dataelem] <= 0x7E )) || (( 0x80 <= p_data[*p_dataelem] ) && ( p_data[*p_dataelem] <= 0xFC ))){
return 1;
}
return 0;
}
/** 全角文字か調べる
* @param data : 文字データ
* @return 1 : 全角文字
* @return 0 : それ以外
*/
int ChekFullWidth( int *p_dataelem, unsigned char *p_data )
{
if((( 0x81 <= p_data[*p_dataelem] ) && ( p_data[*p_dataelem] <= 0x9F )) || (( 0xE0 <= p_data[*p_dataelem] ) && ( p_data[*p_dataelem] <= 0xFC ))){
return 1;
}
return 0;
}