/********************************************//** * Name: * first_transition * * Params: * *comp - A pointer to a compiler. * * Description: * This function will open a file and iterate line by line * and send each line to the parse line function for further * processing. When the file has been completely processed * we will update the symbol table and the data table with * the correct addresses. if we cannot open the file for reading * we will print an error and exit. * * * Return: * 0 * ***********************************************/ int first_transition(Compiler *comp) { int lineNumber = 1; //line number index FILE *pFile = fopen(comp->fileName, "r"); //Open the file for reading //Check if we successfully opend the file if (pFile == NULL) { printf("Can not open file \"%s\"!\n", comp->fileName); exit(0); } //Iterate line by line. while (fgets(comp->line, MAX_LINE_LEN, pFile) != NULL) { //Add line number to the compiler, and increment the index comp->lineIdx = lineNumber++; //Send to parse_line() parse_line(comp); } //Update tables. update_symbol_table(comp); update_data_table(comp); update_entry_table(comp); //Set compiler for second transition. comp->transition = SECOND; fclose(pFile); return 0; }
short pass2( void ) { short int i; unsigned short reloc; register SCNHDR *sec_hdr_ptr; register SEC_DATA *sec_data_ptr; register unsigned long size; SYMBOL *sym; long where_we_were; char section_name[SYMNMLEN + 1]; pass = 2; size = 0; section_name[SYMNMLEN] = '\0'; for( i = 1, sec_hdr_ptr = §ion_header[1]; i <= (short) section_cnt; ++i, ++sec_hdr_ptr ) { strncpy( section_name, sec_hdr_ptr->s_name, SYMNMLEN); sym = symbol_lookup( section_name ); if( NULL == sym ) FATAL_ERROR("Couldn't find section header in symbol table - pass2.c:pass2()"); sym->value = 0L; if( i > 1 ) update_symbol_table( 0L, (long) size, (long) i ); size += (sec_hdr_ptr->s_size / ((sec_hdr_ptr->s_flags & SECTION_PM) == SECTION_PM ? PM_WORD_SIZE : DM_WORD_SIZE)); } if( (obj_fd = fopen( obj_name, UPDATE_BINARY )) == NULL ) { FATAL_ERROR("Error opening object file"); } header_ptr = ftell( obj_fd ); /* Seek past the object file and section headers so we can write the * the raw data for each section. */ fseek( obj_fd, (long)(header_ptr + FILHSZ + AOUTSZ + section_cnt * SCNHSZ), 0 ); glob_sym_fd = temp_file_create( WRITE_BINARY ); glob_sym_temp_index = num_open_files - 1; stat_sym_fd = temp_file_create( WRITE_BINARY ); stat_sym_temp_index = num_open_files - 1; sym_fd = temp_file_create( WRITE_BINARY ); sym_temp_index = num_open_files - 1; rel_fd = temp_file_create( WRITE_BINARY ); rel_temp_index = num_open_files - 1; line_fd = temp_file_create( WRITE_BINARY ); line_temp_index = num_open_files - 1; reloc = 0; size = 0; for( i = 1, sec_hdr_ptr = §ion_header[1], sec_data_ptr = §ion_data[1]; i <= (short) section_cnt; ++i, ++sec_hdr_ptr, ++sec_data_ptr ) { num_line = 0; num_reloc = 0; /* Code generation time */ code_process( temp_file[sec_data_ptr->temp_file_index], (long) size, i ); sec_hdr_ptr->s_nlnno = (unsigned short) num_line; sec_hdr_ptr->s_nreloc = (unsigned short) num_reloc; reloc += sec_hdr_ptr->s_nreloc; size += (sec_hdr_ptr->s_size / ((sec_hdr_ptr->s_flags & SECTION_PM) == SECTION_PM ? PM_WORD_SIZE : DM_WORD_SIZE)); } fixup_symbol_table( sym_fd ); flush_files(); /* Write the finished table to the symbol table file */ if( (glob_sym_fd = fopen(temp_file[glob_sym_temp_index], READ_BINARY )) == NULL ) FATAL_ERROR("Error opening global symbol temp file"); if( (stat_sym_fd = fopen(temp_file[stat_sym_temp_index], READ_BINARY )) == NULL ) FATAL_ERROR("Error opening static symbol temp file"); dump_symbols(); fclose( glob_sym_fd ); fclose( stat_sym_fd ); fflush( sym_fd ); fclose( sym_fd ); /* Write the object file header and the section headers */ where_we_were = ftell( obj_fd ); fseek( obj_fd, 0L, 0 ); object_headers(); fseek( obj_fd, where_we_were, 0 ); /* Write the relocation info to the object file */ if( (rel_fd = fopen(temp_file[rel_temp_index], READ_BINARY)) == NULL ) FATAL_ERROR("Error opening temp relocation file"); write_all_relocation_info( (long) reloc ); fclose( rel_fd ); if( !check_if_errors() ) { /* Append the line number entries, symbol table, and string table * to the end of the object file. */ copy_section( temp_file[line_temp_index] ); copy_section( temp_file[sym_temp_index] ); write_string_table(); fflush( obj_fd ); fclose( obj_fd ); delete_temp_files(); return( 0 ); } else { asm_exit( FATAL ); } }