Skip to content

Instantly share code, notes, and snippets.

@rigibun
Created January 15, 2013 09:57
Show Gist options
  • Save rigibun/4537622 to your computer and use it in GitHub Desktop.
Save rigibun/4537622 to your computer and use it in GitHub Desktop.
#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