Created
January 15, 2013 09:57
-
-
Save rigibun/4537622 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<string.h> | |
int CheckFront(int, char *); | |
int CheckBack(int, char *); | |
int main(int argc, char *argv[]){ | |
char example[] = {"例:bfc ソースファイル [出力ファイル名]"}; | |
char sourceName[32]; | |
char outName[32] = {"out.txt"}; | |
char sourceCode[1000] = {""}; | |
char outPut[1000] = {""}; | |
char buf; | |
FILE *sfp, *ofp; | |
int count; | |
int pc = 0, mp = 0; | |
int memory[100] = {0}; | |
if(argc > 3){ | |
fprintf(stderr, "引数が多すぎます %s\n", example); | |
return 0; | |
} | |
if(argc == 1){ | |
fprintf(stderr, "引数がありません %s\n", example); | |
return 0; | |
} | |
if(strlen(argv[1]) > 31){ | |
fprintf(stderr, "引数が大きすぎます。31文字以内で入力してください。\n"); | |
return 0; | |
} | |
strcpy(sourceName, argv[1]); | |
if(argc == 3) | |
strcpy(outName, argv[2]); | |
sfp = fopen(sourceName, "r"); | |
ofp = fopen(outName, "w"); | |
count = 0; | |
while(count < 999){ | |
if(fscanf(sfp, "%c", &buf) == EOF) break; | |
if(buf != '\n'){ | |
sourceCode[count] = buf; | |
count++; | |
} | |
} | |
sourceCode[count] = '\0'; | |
fclose(sfp); | |
count = 0; | |
while(sourceCode[pc] != '\0'){ | |
switch(sourceCode[pc]){ | |
case '>': | |
mp++; | |
break; | |
case '<': | |
mp--; | |
break; | |
case '+': | |
memory[mp]++; | |
break; | |
case '-': | |
memory[mp]--; | |
break; | |
case '.': | |
outPut[count] = memory[mp]; | |
count++; | |
break; | |
case ',': | |
scanf("%c", &buf); | |
memory[mp] = buf; | |
break; | |
case '[': | |
if(memory[mp] == 0){ | |
pc = CheckFront(pc, sourceCode); | |
if(pc >= strlen(sourceCode)) | |
return 0; | |
} | |
break; | |
case ']': | |
if(memory[mp] != 0){ | |
pc = CheckBack(pc, sourceCode); | |
if(pc < 0) | |
return 0; | |
} | |
break; | |
default: | |
break; | |
} | |
if(mp > 99){ | |
fprintf(stderr, "memory error\n"); | |
return 0; | |
} | |
pc++; | |
} | |
outPut[count] = '\0'; | |
fprintf(ofp, "%s", outPut); | |
fclose(ofp); | |
return 0; | |
} | |
int CheckFront(int pc, char sourceCode[1000]){ | |
int length = strlen(sourceCode); | |
int count = 0; | |
pc++; | |
while(1){ | |
if(sourceCode[pc] == '[') | |
count++; | |
if(sourceCode[pc] == ']'){ | |
if(count == 0) | |
return pc + 1; | |
else | |
count--; | |
} | |
pc++; | |
if(pc >= length) | |
break; | |
} | |
fprintf(stderr, "']'がありません\n"); | |
return -1; | |
} | |
int CheckBack(int pc, char sourceCode[1000]){ | |
int length = strlen(sourceCode); | |
int count = 0; | |
pc--; | |
while(1){ | |
if(sourceCode[pc] == ']') | |
count++; | |
if(sourceCode[pc] == '['){ | |
if(count == 0) | |
return pc; | |
else | |
count--; | |
} | |
pc--; | |
if(pc < 0) | |
break; | |
} | |
fprintf(stderr, "'['がありません\n"); | |
return -1; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment