/** * Initialises the scanner */ void init_scanner(const char *name) { // Initialise character table for (int i = 0; i < 256; ++i) char_table[i] = SPECIAL; for (int i = '0'; i <= '9'; ++i) char_table[i] = DIGIT; for (int i = 'A'; i <= 'Z'; ++i) char_table[i] = LETTER; for (int i = 'a'; i <= 'z'; ++i) char_table[i] = LETTER; char_table[EOF_CHAR] = EOF_CODE; char_table[EOL_CHAR] = EOL_CODE; char_table[(int)'$'] = DIGIT; // Needed for hexadecimal number handling open_source_file(name); }
/* Function to display source in the source window. */ enum tui_status tui_set_source_content (struct symtab *s, int line_no, int noerror) { enum tui_status ret = TUI_FAILURE; if (s != (struct symtab *) NULL && s->filename != (char *) NULL) { FILE *stream; int i, desc, c, line_width, nlines; char *src_line = 0; if ((ret = tui_alloc_source_buffer (TUI_SRC_WIN)) == TUI_SUCCESS) { line_width = TUI_SRC_WIN->generic.width - 1; /* Take hilite (window border) into account, when calculating the number of lines */ nlines = (line_no + (TUI_SRC_WIN->generic.height - 2)) - line_no; desc = open_source_file (s); if (desc < 0) { if (!noerror) { char *name = alloca (strlen (s->filename) + 100); sprintf (name, "%s:%d", s->filename, line_no); print_sys_errmsg (name, errno); } ret = TUI_FAILURE; } else { if (s->line_charpos == 0) find_source_lines (s, desc); if (line_no < 1 || line_no > s->nlines) { close (desc); printf_unfiltered ( "Line number %d out of range; %s has %d lines.\n", line_no, s->filename, s->nlines); } else if (lseek (desc, s->line_charpos[line_no - 1], 0) < 0) { close (desc); perror_with_name (s->filename); } else { int offset, cur_line_no, cur_line, cur_len, threshold; struct tui_gen_win_info * locator = tui_locator_win_info_ptr (); struct tui_source_info * src = &TUI_SRC_WIN->detail.source_info; if (TUI_SRC_WIN->generic.title) xfree (TUI_SRC_WIN->generic.title); TUI_SRC_WIN->generic.title = xstrdup (s->filename); if (src->filename) xfree (src->filename); src->filename = xstrdup (s->filename); /* Determine the threshold for the length of the line and the offset to start the display. */ offset = src->horizontal_offset; threshold = (line_width - 1) + offset; stream = fdopen (desc, FOPEN_RT); clearerr (stream); cur_line = 0; src->start_line_or_addr.loa = LOA_LINE; cur_line_no = src->start_line_or_addr.u.line_no = line_no; if (offset > 0) src_line = (char *) xmalloc ( (threshold + 1) * sizeof (char)); while (cur_line < nlines) { struct tui_win_element * element = (struct tui_win_element *) TUI_SRC_WIN->generic.content[cur_line]; /* get the first character in the line */ c = fgetc (stream); if (offset == 0) src_line = ((struct tui_win_element *) TUI_SRC_WIN->generic.content[ cur_line])->which_element.source.line; /* Init the line with the line number */ sprintf (src_line, "%-6d", cur_line_no); cur_len = strlen (src_line); i = cur_len - ((cur_len / tui_default_tab_len ()) * tui_default_tab_len ()); while (i < tui_default_tab_len ()) { src_line[cur_len] = ' '; i++; cur_len++; } src_line[cur_len] = (char) 0; /* Set whether element is the execution point and whether there is a break point on it. */ element->which_element.source.line_or_addr.loa = LOA_LINE; element->which_element.source.line_or_addr.u.line_no = cur_line_no; element->which_element.source.is_exec_point = (strcmp (((struct tui_win_element *) locator->content[0])->which_element.locator.file_name, s->filename) == 0 && cur_line_no == ((struct tui_win_element *) locator->content[0])->which_element.locator.line_no); if (c != EOF) { i = strlen (src_line) - 1; do { if ((c != '\n') && (c != '\r') && (++i < threshold)) { if (c < 040 && c != '\t') { src_line[i++] = '^'; src_line[i] = c + 0100; } else if (c == 0177) { src_line[i++] = '^'; src_line[i] = '?'; } else { /* Store the charcter in the line buffer. If it is a tab, then translate to the correct number of chars so we don't overwrite our buffer. */ if (c == '\t') { int j, max_tab_len = tui_default_tab_len (); for (j = i - ( (i / max_tab_len) * max_tab_len); ((j < max_tab_len) && i < threshold); i++, j++) src_line[i] = ' '; i--; } else src_line[i] = c; } src_line[i + 1] = 0; } else { /* If we have not reached EOL, then eat chars until we do */ while (c != EOF && c != '\n' && c != '\r') c = fgetc (stream); } } while (c != EOF && c != '\n' && c != '\r' && i < threshold && (c = fgetc (stream))); } /* Now copy the line taking the offset into account */ if (strlen (src_line) > offset) strcpy (((struct tui_win_element *) TUI_SRC_WIN->generic.content[ cur_line])->which_element.source.line, &src_line[offset]); else ((struct tui_win_element *) TUI_SRC_WIN->generic.content[ cur_line])->which_element.source.line[0] = (char) 0; cur_line++; cur_line_no++; } if (offset > 0) xfree (src_line); fclose (stream); TUI_SRC_WIN->generic.content_size = nlines; ret = TUI_SUCCESS; } } } } return ret; }
void src_open_file (XmConst char *c_file_name, char *full_file_name) { uil_fcb_type *az_fcb; /* file control block ptr */ status l_open_status; /* status variable */ src_source_buffer_type *az_source_buffer; /* source buffer ptr */ /* allocate fcb and source buffer */ az_fcb = (uil_fcb_type *) _get_memory (sizeof (uil_fcb_type)); if (src_az_avail_source_buffer != NULL) { az_source_buffer = src_az_avail_source_buffer; src_az_avail_source_buffer = src_az_avail_source_buffer->az_prior_source_buffer; } else { az_source_buffer = (src_source_buffer_type *) _get_memory (sizeof (src_source_buffer_type)); } /* Call the OS-specific open file procedure */ l_open_status = open_source_file ( c_file_name, az_fcb, az_source_buffer ); /* If the file is not found, a fatal error is generated. */ if ( l_open_status == src_k_open_error ) { diag_issue_diagnostic( d_src_open, diag_k_no_source, diag_k_no_column, c_file_name ); } /* put fcb in the file table */ src_l_last_source_file_number++; if (src_l_last_source_file_number >= src_k_max_source_files) { diag_issue_diagnostic ( d_src_limit, src_az_current_source_record, src_az_current_source_buffer -> w_current_position - 1, az_fcb->expanded_name ); } src_az_source_file_table[ src_l_last_source_file_number ] = az_fcb; /* Complete the OS-independent initialization. Get the size of the file ** for %complete info then initialize a source ** buffer placing a null in the buffer will cause the lexical analyzer ** to start by reading the first line of the file */ /* %COMPLETE */ if (stat(az_fcb->expanded_name, &stbuf) == -1) { diag_issue_diagnostic( d_src_open, diag_k_no_source, diag_k_no_column, az_fcb->expanded_name ); } Uil_file_size = stbuf.st_size; if (full_file_name != NULL) strcpy (full_file_name, az_fcb->expanded_name); az_fcb->v_position_before_get = FALSE; az_source_buffer->w_current_line_number = 0; az_source_buffer->b_file_number = src_l_last_source_file_number; az_source_buffer->w_current_position = 0; az_source_buffer->c_text[ 0 ] = 0; /* make the source buffer current */ az_source_buffer->az_prior_source_buffer = src_az_current_source_buffer; src_az_current_source_buffer = az_source_buffer; return; }
int main(int argc, char *argv[]) { interpret_args(argc, argv); // Open files and set info open_source_file(filename); dest_info.samplerate = 44100; dest_info.channels = 2; dest_info.format = SF_FORMAT_WAV ^ SF_FORMAT_PCM_16 ^ SF_ENDIAN_FILE; open_dest_file(dest_file, &dest_info); if (verbose) { logger(NOTICE, "Sample rate: %d", source_info.samplerate); logger(NOTICE, "Frames: %d", (int) source_info.frames); logger(NOTICE, "Channels: %d", source_info.channels); logger(NOTICE, "%s minutes long.", prettify_seconds(source_info.frames/(double) source_info.samplerate, 0)); } // Calculate Root-Mean-Square of source sound FRAMES_IN_RMS_FRAME = (source_info.samplerate*RMS_FRAME_DURATION)/1000; // (44100/1000)*20 RMS_FRAME_COUNT = ceil(source_info.frames/(float) FRAMES_IN_RMS_FRAME); float *rms = malloc(2*RMS_FRAME_COUNT*sizeof(float)); calculate_rms(rms); if (verbose) { logger(NOTICE, "Calculated RMS!"); } // Calculate RMS-derived features of long (1 second) frames FRAMES_IN_LONG_FRAME = (source_info.samplerate*LONG_FRAME_DURATION)/1000; // (44100/1000)*20 LONG_FRAME_COUNT = ceil(source_info.frames/(float) FRAMES_IN_LONG_FRAME); RMS_FRAMES_IN_LONG_FRAME = LONG_FRAME_DURATION/RMS_FRAME_DURATION; float *mean_rms = malloc(2*LONG_FRAME_COUNT*sizeof(float)); float *variance_rms = malloc(2*LONG_FRAME_COUNT*sizeof(float)); float *norm_variance_rms = malloc(2*LONG_FRAME_COUNT*sizeof(float)); float *mler = malloc(2*LONG_FRAME_COUNT*sizeof(float)); calculate_features(rms, mean_rms, variance_rms, norm_variance_rms, mler); logger(NOTICE, "Calculated features!"); // CLASSIFY bool *is_music = malloc(2*LONG_FRAME_COUNT*sizeof(bool)); // Decide whether a given second segment is music or speech, // based on the MLER value and the Upper Music Threshold classify_segments(is_music, mler); // The music-ness of the frame equals the average music-ness of itself and // the two previous and next frames average_musicness(is_music); // Merge smaller segments with larger segments segment *merged_segments = malloc(LONG_FRAME_COUNT*sizeof(segment)); int merged_segment_count = merge_segments(is_music, merged_segments); // Finally, we write only the speech sections to the destination file write_speech_to_file(merged_segments, merged_segment_count); // Close files and free memory bool file_close_success = finalize_files(); logger(WARNING, "Successfully generated %s!", output_path); free(mean_rms); free(variance_rms); free(norm_variance_rms); free(mler); free(merged_segments); free(is_music); free(rms); return !file_close_success; }