Loading malbolge20.c +51 −14 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ #include <ctype.h> #include <string.h> #include <math.h> #include <unistd.h> #define ALLOCATED 1 #define UNALLOCATED 0 Loading @@ -26,7 +27,7 @@ const char xlat2[] = "5z]&gqtyfr$(we4{WP)H-Zn,[%\\3dL+Q;>U!pJS72FhOA1C" "B6v^=I_0/8|jsb9m<.TVac`uY*MK'X~xDl}REokN:#?G\"i@"; FILE *f; FILE *fperror; int main( int argc, char **argv ) { Loading @@ -36,18 +37,43 @@ int main( int argc, char **argv ) unsigned int i,ii = 0; int x; int opt, outf=0; char *usage="Usage: malbolge20 [-oh] prog-file\n"; while ((opt = getopt(argc, argv, "o")) != -1) { switch (opt){ case 'o': outf=1; break; case 'h': default: fputs(usage, stderr); return (1); } } for(i=0;i<59049;i++){// フラグ初期化 flag[i]=UNALLOCATED; } if ( argc != 2 ) if ( outf ) { FILE *tmpf; if ( ( tmpf = fopen( "info", "w" ) ) != NULL ) { fperror = tmpf; } } else fperror = stdout; if ( (argc - optind) != 1 ) { fputs( "Usage: malbolge20 prog-file\n", stderr ); fputs(usage, stderr ); return ( 1 ); } if ( ( f = fopen( argv[1], "r" ) ) == NULL ) if ( ( f = fopen( argv[optind], "r" ) ) == NULL ) { fputs( "can't open file\n", stderr ); fputs( "can't open input file\n", stderr ); return ( 1 ); } Loading @@ -55,7 +81,8 @@ int main( int argc, char **argv ) if ( mem == NULL ) { fclose( f ); fputs( "can't allocate memory\n", stderr ); fprintf(fperror, "Error: can't allocate memory\n" ); fclose(fperror); return ( 1 ); } Loading @@ -65,7 +92,8 @@ int main( int argc, char **argv ) if ( mem[id] == NULL ) { fclose( f ); fputs( "can't allocate memory\n", stderr ); fprintf(fperror, "Error: can't allocate memory\n" ); fclose(fperror); return ( 1 ); } flag[id]=ALLOCATED; Loading @@ -79,15 +107,17 @@ int main( int argc, char **argv ) { if ( strchr( "ji*p</vo", xlat1[( x - 33 + ii ) % 94] ) == NULL ) { fputs( "invalid character in source file\n", stderr ); fprintf(fperror, "Error: invalid character (ascii=%d) in source file\n",x); free( mem ); fclose( f ); fclose(fperror); return ( 1 ); } }else{ fputs( "invalid character in source file\n", stderr ); fprintf(fperror, "Error: invalid character (ascii=%d) in source file\n", x); free( mem ); fclose( f ); fclose(fperror); return ( 1 ); } mem[id][i++] = x; Loading @@ -99,6 +129,7 @@ int main( int argc, char **argv ) fputs( "input file too long\n", stderr ); free( mem ); fclose( f ); fclose(fperror); return ( 1 ); } //次ブロックのメモリ領域を確保 Loading @@ -106,7 +137,8 @@ int main( int argc, char **argv ) if ( mem[id] == NULL ) { fclose( f ); fputs( "can't allocate memory\n", stderr ); fprintf(fperror, "Error: can't allocate memory\n" ); fclose(fperror); return ( 1 ); } flag[id]=ALLOCATED;//第idブロックを使用済みに変更 Loading @@ -132,6 +164,8 @@ int main( int argc, char **argv ) exec( flag, mem, init );//実行 free( mem ); if(outf) fprintf(fperror,"Execution completed.\n"); fclose(fperror); return ( 0 ); } Loading Loading @@ -186,7 +220,8 @@ void mem_manage(unsigned int *reg_addr, unsigned int num, int *id, unsigned int if ( mem[new_id] == NULL ){ fclose( f ); free(mem); fputs( "can't allocate memory\n", stderr ); fprintf(fperror, "Error: can't allocate memory\n"); fclose(fperror); exit ( 1 ); } mem[new_id][0] = init[new_id][0]; Loading @@ -213,7 +248,8 @@ void increment(unsigned int *reg_addr, int *id, int flag[59049], unsigned int ** mem[*id] = (unsigned int *)malloc( sizeof(unsigned int) * 59049 ); if ( mem[*id] == NULL ){ fclose( f ); fputs( "can't allocate memory\n", stderr ); fprintf(fperror, "Error: can't allocate memory\n"); fclose(fperror); exit ( 1 ); } mem[*id][0] = init[*id][0]; Loading @@ -238,7 +274,8 @@ void exec( int flag[59049], unsigned int **mem, unsigned int init[59049][2] ) for (;;) { if ( mem[c_id][c] < 33 || mem[c_id][c] > 126 ) { printf("Enter into an infinite loop. exit(1). "); fprintf(fperror,"Error: enterring into an infinite loop.\n"); fclose(fperror); exit(1); //continue; // もともとの処理 } Loading Loading
malbolge20.c +51 −14 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ #include <ctype.h> #include <string.h> #include <math.h> #include <unistd.h> #define ALLOCATED 1 #define UNALLOCATED 0 Loading @@ -26,7 +27,7 @@ const char xlat2[] = "5z]&gqtyfr$(we4{WP)H-Zn,[%\\3dL+Q;>U!pJS72FhOA1C" "B6v^=I_0/8|jsb9m<.TVac`uY*MK'X~xDl}REokN:#?G\"i@"; FILE *f; FILE *fperror; int main( int argc, char **argv ) { Loading @@ -36,18 +37,43 @@ int main( int argc, char **argv ) unsigned int i,ii = 0; int x; int opt, outf=0; char *usage="Usage: malbolge20 [-oh] prog-file\n"; while ((opt = getopt(argc, argv, "o")) != -1) { switch (opt){ case 'o': outf=1; break; case 'h': default: fputs(usage, stderr); return (1); } } for(i=0;i<59049;i++){// フラグ初期化 flag[i]=UNALLOCATED; } if ( argc != 2 ) if ( outf ) { FILE *tmpf; if ( ( tmpf = fopen( "info", "w" ) ) != NULL ) { fperror = tmpf; } } else fperror = stdout; if ( (argc - optind) != 1 ) { fputs( "Usage: malbolge20 prog-file\n", stderr ); fputs(usage, stderr ); return ( 1 ); } if ( ( f = fopen( argv[1], "r" ) ) == NULL ) if ( ( f = fopen( argv[optind], "r" ) ) == NULL ) { fputs( "can't open file\n", stderr ); fputs( "can't open input file\n", stderr ); return ( 1 ); } Loading @@ -55,7 +81,8 @@ int main( int argc, char **argv ) if ( mem == NULL ) { fclose( f ); fputs( "can't allocate memory\n", stderr ); fprintf(fperror, "Error: can't allocate memory\n" ); fclose(fperror); return ( 1 ); } Loading @@ -65,7 +92,8 @@ int main( int argc, char **argv ) if ( mem[id] == NULL ) { fclose( f ); fputs( "can't allocate memory\n", stderr ); fprintf(fperror, "Error: can't allocate memory\n" ); fclose(fperror); return ( 1 ); } flag[id]=ALLOCATED; Loading @@ -79,15 +107,17 @@ int main( int argc, char **argv ) { if ( strchr( "ji*p</vo", xlat1[( x - 33 + ii ) % 94] ) == NULL ) { fputs( "invalid character in source file\n", stderr ); fprintf(fperror, "Error: invalid character (ascii=%d) in source file\n",x); free( mem ); fclose( f ); fclose(fperror); return ( 1 ); } }else{ fputs( "invalid character in source file\n", stderr ); fprintf(fperror, "Error: invalid character (ascii=%d) in source file\n", x); free( mem ); fclose( f ); fclose(fperror); return ( 1 ); } mem[id][i++] = x; Loading @@ -99,6 +129,7 @@ int main( int argc, char **argv ) fputs( "input file too long\n", stderr ); free( mem ); fclose( f ); fclose(fperror); return ( 1 ); } //次ブロックのメモリ領域を確保 Loading @@ -106,7 +137,8 @@ int main( int argc, char **argv ) if ( mem[id] == NULL ) { fclose( f ); fputs( "can't allocate memory\n", stderr ); fprintf(fperror, "Error: can't allocate memory\n" ); fclose(fperror); return ( 1 ); } flag[id]=ALLOCATED;//第idブロックを使用済みに変更 Loading @@ -132,6 +164,8 @@ int main( int argc, char **argv ) exec( flag, mem, init );//実行 free( mem ); if(outf) fprintf(fperror,"Execution completed.\n"); fclose(fperror); return ( 0 ); } Loading Loading @@ -186,7 +220,8 @@ void mem_manage(unsigned int *reg_addr, unsigned int num, int *id, unsigned int if ( mem[new_id] == NULL ){ fclose( f ); free(mem); fputs( "can't allocate memory\n", stderr ); fprintf(fperror, "Error: can't allocate memory\n"); fclose(fperror); exit ( 1 ); } mem[new_id][0] = init[new_id][0]; Loading @@ -213,7 +248,8 @@ void increment(unsigned int *reg_addr, int *id, int flag[59049], unsigned int ** mem[*id] = (unsigned int *)malloc( sizeof(unsigned int) * 59049 ); if ( mem[*id] == NULL ){ fclose( f ); fputs( "can't allocate memory\n", stderr ); fprintf(fperror, "Error: can't allocate memory\n"); fclose(fperror); exit ( 1 ); } mem[*id][0] = init[*id][0]; Loading @@ -238,7 +274,8 @@ void exec( int flag[59049], unsigned int **mem, unsigned int init[59049][2] ) for (;;) { if ( mem[c_id][c] < 33 || mem[c_id][c] > 126 ) { printf("Enter into an infinite loop. exit(1). "); fprintf(fperror,"Error: enterring into an infinite loop.\n"); fclose(fperror); exit(1); //continue; // もともとの処理 } Loading