Last active
May 31, 2016 14:01
-
-
Save yakimelon/51aa507622684b01238c1a56b02047fa to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<stdio.h> | |
#include<stdlib.h> | |
#include<string.h> | |
#include<ctype.h> | |
#define TRUE 1 | |
#define FALSE 0 | |
#define MAX_MAGIC 2 | |
#define MAX_SOURCE 20 | |
#define MAX_DESTINATION 20 | |
/* バイトオーダーの違いを吸収する */ | |
typedef union{ | |
unsigned int byte_4; | |
char byte_1[4]; | |
}byte_union; | |
/*------------ | |
| その他関数 | | |
------------*/ | |
/* 文字列を小文字に変換 */ | |
void str_to_lower(char *str,int size){ | |
int i; | |
for( i=0 ; i<MAX_SOURCE+1 ; i++ ) str[i] = tolower(str[i]); | |
} | |
/* バイトオーダー変換 */ | |
void change_byte_order(byte_union *data){ | |
const int INT_SIZE = sizeof(int) - 1; | |
byte_union tmp_data; | |
// バイトオーダー変換 | |
int i; | |
for( i=0 ; i<4 ; i++ ) tmp_data.byte_1[i] = data->byte_1[INT_SIZE-i]; | |
// 代入 | |
data->byte_4 = tmp_data.byte_4; | |
} | |
/*------- | |
| 条件 | | |
------- */ | |
/* Magicの検証 */ | |
int Condition1(char *data){ | |
if( strcmp(data,"RH") == 0 ) return TRUE; | |
else return FALSE; | |
} | |
/* Sourceの検証 */ | |
int Condition2(char *data){ | |
str_to_lower(data, MAX_SOURCE); | |
if( strcmp(data,"rise-san") == 0 || strcmp(data,"cocoa-san") == 0 ) return TRUE; | |
else return FALSE; | |
} | |
/* Destinationの検証 */ | |
int Condition3(char *data){ | |
str_to_lower(data, MAX_DESTINATION); | |
if( strcmp(data,"chino-chan") == 0 || strcmp(data, "chino") == 0 ) return TRUE; | |
else return FALSE; | |
} | |
/* data に valid_order_brand が含まれているか検証 */ | |
int Condition4(char *data){ | |
const char *valid_order_brand[3] = { | |
"BlueMountain", | |
"Columbia", | |
"OriginalBlend" | |
}; | |
int i=0; | |
for( i=0 ; i<3 ; i++ ) if( strstr(data,valid_order_brand[i]) != NULL ) return TRUE; | |
return TRUE; | |
} | |
/* data に invalid_order_brand が含まれていないか検証 */ | |
int Condition5(char *data){ | |
const char *invalid_order_brand[2] = { | |
"DandySoda", | |
"FrozenEvergreen" | |
}; | |
int i=0; | |
for( i=0 ; i<2 ; i++ ) if( strstr(data,invalid_order_brand[i]) != NULL ) return FALSE; | |
return TRUE; | |
} | |
/*----------- | |
|メイン関数 | | |
-----------*/ | |
int main(void) | |
{ | |
// 変数宣言(ファイルからデータを読み込む変数は、読み込んだデータを文字列として扱うために \0 の領域分を確保している) | |
char Magic[MAX_MAGIC+1]; | |
char Source[MAX_SOURCE+1]; | |
char Destination[MAX_DESTINATION+1]; | |
byte_union DataLength; | |
char *Data; | |
int byte_count = 0; | |
int pass_flag = 0; | |
int loop_count = 0; // ループ回数を出力するためのもので、ループ処理には使用されない | |
// 条件が全て通ったときの pass_flag の値 | |
const int PASS_FLAG_COUNT = 4; | |
//ファイル読み出し | |
FILE *fp; | |
fp = fopen("pyonpyon.rh","rb"); | |
if(fp == NULL){ | |
printf("ファイル読み込み失敗\n"); | |
exit(0); | |
} | |
// ファイルサイズ取得 | |
fpos_t fsize = 0; | |
fseek(fp,0,SEEK_END); | |
fgetpos(fp,&fsize); | |
fseek(fp,0,SEEK_SET); | |
// ファイル終端まで読み出す | |
while( byte_count < fsize ){ | |
// データ読み込み変数初期化 | |
memset(Magic,'\0',sizeof(Magic)); | |
memset(Source,'\0',sizeof(Source)); | |
memset(Destination,'\0',sizeof(Destination)); | |
// 一連のファイルを読み出す | |
fread(Magic,sizeof(char),MAX_MAGIC,fp); | |
fread(Source,sizeof(char),MAX_SOURCE,fp); | |
fread(Destination,sizeof(char),MAX_DESTINATION,fp); | |
fread(&DataLength.byte_4,sizeof(int),1,fp); | |
// pyonpyon.rh はビッグエンディアンだが、windowsはリトルエンディアンなので変換する | |
change_byte_order(&DataLength); | |
Data = (char *)calloc(DataLength.byte_4+1,sizeof(char)); | |
fread(Data,DataLength.byte_4,1,fp); | |
// バイトカウントに読み込んだバイト数加算 | |
byte_count += MAX_MAGIC + MAX_SOURCE + MAX_DESTINATION + sizeof(int) + DataLength.byte_4; | |
// 判定 | |
if( Condition1(Magic) ) pass_flag++; | |
if( Condition2(Source) ) pass_flag++; | |
if( Condition3(Destination) ) pass_flag++; | |
if( Condition4(Data) && Condition5(Data) ) pass_flag++; | |
// ループカウント更新 | |
loop_count++; | |
// 結果出力 | |
if( pass_flag == PASS_FLAG_COUNT ) printf("%2d回目:PASS\n",loop_count); | |
else printf("%2d回目:REJECTED\n",loop_count); | |
// メモリ開放 & paa_flag初期化 | |
free(Data); | |
pass_flag = 0; | |
} | |
fclose(fp); | |
return 0; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
/* 実行結果 */