Commit 4b90cdd6 authored by Masahiko Sakai's avatar Masahiko Sakai
Browse files

option -o that writes info file for web-interface

parent a93ad542
Loading
Loading
Loading
Loading
+51 −14
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <unistd.h>

#define ALLOCATED 1
#define UNALLOCATED 0
@@ -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 )
{

@@ -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 );
    }

@@ -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 );
    }

@@ -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;
@@ -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;
@@ -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 );
	  }
	//次ブロックのメモリ領域を確保
@@ -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ブロックを使用済みに変更
@@ -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 );
}

@@ -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];
@@ -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];
@@ -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; // もともとの処理
	}