int main(int argv, char **argc){
  int state = NOT_HALTED;
  struct instruction *instr_array;
  
  if(argv!=2){
    fprintf(stderr, "Invalid input\n");
    return -1;
  }

  FILE *assembly_file;
  assembly_file = fopen(argc[1],"r");
  
  if(assembly_file==NULL){
    fprintf(stderr, "File not found");
    return -1;
  }
	
  FILE *diss_file;
  diss_file = fopen("file_dissassembled", "w+");
  if(diss_file==NULL){
    fprintf(stderr, "Error opening file for write");
    return -1;
  }
  
  int len = 0;
  char *line = (char *) calloc(1,BUFF_LEN+1);
  int intarray[100];
  int intindex = 0;
  
  while((fgets(line,BUFF_LEN,assembly_file))!=NULL){
	if(strlen(line)>2){
		*instr_array = get_instruction(line);
		if(instr_array->instr[0]==JMP){
			int a = (int)instr_array->instr[1]-'0';
			int b = (int)instr_array->instr[2]-'0';
			int c = (int)instr_array->instr[3]-'0';
			intarray[intindex]=(a*100+b*10+c*1);
			intindex++;
		}
	}
	free(line);
	line = (char*) calloc(1,BUFF_LEN+1);
  }
  intarray[intindex] = -1; //prevent oob
  rewind(assembly_file);
  intindex = 0;
  int intiter = 0;
  while((fgets(line,BUFF_LEN,assembly_file))!=NULL){
	if(strlen(line)>2){
		*instr_array = get_instruction(line);
		char *str;
		str = get_str_from_instr((*instr_array));
		fputs(instr_array->ip,diss_file);
		fputs(" ",diss_file);
		fputs(instr_array->instr,diss_file);
		fputs(" ",diss_file);
		if(has_int(intindex,intarray)||state==HALTEDB){
			fputs("L",diss_file);
			char* temp;
			if(intindex<10){
				char sig = '0'+intindex;
				*temp = sig;
				fputs(temp,diss_file);
				fputs(":",diss_file);
				fputs("  ",diss_file);
			} else if(intindex<100){
				char sig1 = '0'+intindex/10;
				char sig2 = '0'+intindex%10;
				*temp = sig1;
				*(temp+1)=sig2;
				fputs(temp,diss_file);
				fputs(":",diss_file);
				fputs(" ",diss_file);
			} else if(intindex<1000){
				char sig1 = '0'+intindex/100;
				char sig2 = '0'+intindex/10;
				char sig3 = '0'+intindex%10;
				*temp = sig1;
				*(temp+1)=sig2;
				*(temp+2)=sig3;
				fputs(temp,diss_file);
				fputs(":",diss_file);
			} else {
				fputs("X",diss_file);
			}
			intiter++;
			if(state==HALTEDB)
				state=HALTED;
		} else {
			fputs("     ",diss_file);
		}
		fputs(" ",diss_file);
		if(strlen(instr_array->instr)>2 &&state!=HALTED)
			fputs(str,diss_file);
		else if(strlen(instr_array->instr)>2 &&state==HALTED)
			fputs(".word",diss_file);
		fputs("\n",diss_file);
		if(strcasecmp(instr_array->instr,"0000 ")==0&&len>2&&state!=HALTED){
			state = HALTEDB;
			}
		len++;
		intindex++;
	}
  }
  fclose(diss_file);
  fclose(assembly_file);
  return 1;
}
Пример #2
0
bool get_int(HSQUIRRELVM vm, const char* name, int& val) {
  if (!has_int(vm, name)) return false;
  val = read_int(vm, name);
  return true;
}