/*************************************************************************** * Copyright (C) 1994 Charles P. Peterson * * 4007 Enchanted Sun, San Antonio, Texas 78244-1254 * * Email: Charles_P_Peterson@fcircus.sat.tx.us * * * * This is free software with NO WARRANTY. * * See gfft.c, or run program itself, for details. * * Support is available for a fee. * *************************************************************************** * * Program: gfft--General FFT analysis * File: messages.c * Purpose: (most) console messages * Author: Charles Peterson (CPP) * History: 3-August-1993 CPP; Created. * 30-June-1994 CPP (0.72); Expanded launching script for MORE * 6-July-1994 CPP (0.73); call display_file() in more_strings * 6-July-1994 CPP (0.74); allow simultaneous MORE sessions * 27-July-1994 CPP (1.03); fix COPYING display under ADOS 1.3 * 12-Aug-1994 CPP (1.11); fix enforcer hit in more_strings * 13-January-1995 CPP (1.19) use for ANSI compat * 17-Jan-1995 CPP (1.20); Size shells nicely * 20-Jan-1995 CPP (1.24); Remove enforcer hits during show * 20-Jan-1994 CPP (1.23); Use icon tooltypes * 15-Feb-1995 CPP (1.43); Show all non-default settings * * Comments: This is where message strings are output. * The include file messages.h should ONLY be included here. */ #include #include #include #include /* tolower */ #include "gfft.h" #include "settings.h" #include "messages.h" #include "format.h" #include "wbench.h" extern struct Window *dialog_window_p; extern struct Gadget *message_gadgetp; #define CONSOLE_WIDTH 79 #define PAGE_SIZE 20 #define MESSAGE_BUFSIZE 160 extern Name_Info_St Gfft_Command[]; extern int Shell_Width; extern int Shell_Height; static char message___message_buf[MESSAGE_IOBUFFER_SIZE]; static FILE *message___read_file = NULL; static char **message___strings = NULL; static int message___string_index = 0; static void display_iterate (char *iterator_func()); static void display_strings (char *messagestrings[]); static char *next_file_line (void); static char *next_string (void); static void message_display (char *message_string, FILE *output_ptr); static void error_message_display (char *message_string, FILE *output_ptr); static void more_strings (char **message_strings); #ifdef AMIGA static void display_file (char *filename, BOOLEAN delete); #else static void display_file (FILE *read_file); #endif static int count = 0; char *banner_message (char *arguments) { char name_string[82]; int i; int name_length; int name_delta; int name_indent; int copyright_length = strlen (Copyright); int copyright_delta = CONSOLE_WIDTH - copyright_length; int copyright_indent = copyright_delta / 2; strcpy (name_string, NameAuthor); strcat (name_string, VersionData); name_length = strlen (name_string); name_delta = CONSOLE_WIDTH - name_length; name_indent = name_delta / 2; printf ("\n"); for (i = 0; i < name_indent; i++) printf (" "); printf (name_string); printf ("\n"); for (i = 0; i < copyright_indent; i++) printf (" "); printf (Copyright); display_strings (banner_strings); return arguments; } char *about_message (char *arguments) { display_strings (Author_Strings); return arguments; } #define HELP_BUFSIZ 90 static char *help_message_with_arguments (char *arguments) /* * Note: the assumption is made that all arguments present are to be * used in the help command (even though only one argument is currently * supported). Thus, a help command could not be used at the beginning * of a batch command, followed by 'real' commands. In fact, given the * current batch command algorithm, a help command with arguments in * batch wouldn't work anyway...the arguments would be assumed to be * real commands. */ { FILE *help_file_ptr; FILE *message_file_ptr; char help_buf[HELP_BUFSIZ]; char message_file_name[MAX_PATH]; int i; int length = strlen (arguments); #ifdef AMIGA sprintf (message_file_name, "%s%d", MESSAGE_FILE_NAME, ++count); message_file_ptr = fopen (message_file_name, "w"); if (!message_file_ptr) { error_message (CANT_CREATE_MESSAGE_FILE); RAISE_ERROR (NOTHING_SPECIAL); /* longjmp outa here! */ } #else message_file_ptr = stdout; #endif if (help_file_ptr = gopen (HelpPathList, HELP_FILE_NAME, "r")) { while (fgets (help_buf, HELP_BUFSIZ, help_file_ptr)) { if (help_buf[0] == '?') { for (i = 0; i < length; i++) { if (tolower (help_buf[i+1]) != tolower (arguments[i])) break; } if (length == i) /* No mismatch */ { BOOLEAN line_output_already = FALSE; while (fgets (help_buf, HELP_BUFSIZ, help_file_ptr)) { if (help_buf[0] != ' ' && help_buf[0] != '\n') { if (line_output_already) break; continue; } line_output_already = TRUE; fputs (help_buf, message_file_ptr); } # ifdef AMIGA fclose (message_file_ptr); display_file (message_file_name, TRUE); # else display_file (message_file_ptr); fclose (message_file_ptr); # endif fclose (help_file_ptr); return NullString; } } } fclose (help_file_ptr); fclose (message_file_ptr); error_message (HELP_MESSAGE_UNAVAILABLE); RAISE_ERROR (NOTHING_SPECIAL); /* longjmp outa here */ } fclose (message_file_ptr); error_message (HELP_FILE_NOT_FOUND); RAISE_ERROR (NOTHING_SPECIAL); /* longjmp outa here */ return NullString; /* shouldn't get here actually */ } char *copying_message (char *arguments) { FILE *copying_file; if (copying_file = gopen (HelpPathList,"COPYING","r")) { # ifdef AMIGA /* bugfix (1.03) * under 1.3, spawned process doesn't inheirit current directory (DAMN!) * so, we must copy COPYING into a temporary file so that we know where * it is. */ FILE *message_file; char buffer[HELP_BUFSIZ]; char message_file_name[MAX_PATH]; sprintf (message_file_name, "%s%d", MESSAGE_FILE_NAME, ++count); message_file = fopen (message_file_name, "w"); if (!message_file) { error_message (CANT_CREATE_MESSAGE_FILE); RAISE_ERROR (NOTHING_SPECIAL); /* longjmp outa here! */ } while (fgets (buffer, HELP_BUFSIZ, copying_file)) { fputs (buffer, message_file); } fclose (copying_file); fclose (message_file); display_file (message_file_name, TRUE); # else /* AMIGA not defined */ display_file (copying_file); fclose (copying_file); # endif } else { more_strings (copying_unavailable_strings); } return arguments; } char *no_warranty_message (char *arguments) { more_strings (no_warranty_strings); return arguments; } char *question_message (char *arguments) { display_strings (question_message_strings); return arguments; } #define HELP_COLUMNS 3 #if (HELP_COLUMNS == 3) #define TAB_1 26 #define TAB_2 52 #else #define TAB_1 20 #define TAB_2 40 #define TAB_3 60 #endif char *help_message (char *arguments) { /* * I find it easier to read commands if they are listed in multiple columns * AND if each column has commands in alphabetical order */ int i; int midcommand; int end_command_number; int col; char message_file_name[MAX_PATH]; FILE *message_file_ptr; if (arguments[0] != '\0') { return help_message_with_arguments (arguments); } #ifdef AMIGA /* Use MORE to display in separate shell */ sprintf (message_file_name, "%s%d", MESSAGE_FILE_NAME, ++count); message_file_ptr = fopen (message_file_name, "w"); if (!message_file_ptr) { error_message (CANT_CREATE_MESSAGE_FILE); RAISE_ERROR (NOTHING_SPECIAL); /* longjmp outa here! */ } #else message_file_ptr = stdout; #endif for (i = 0; strlen (Gfft_Command[i].full_string); i++); end_command_number = i + 1; midcommand = end_command_number / HELP_COLUMNS; for (i = 0; help_prolog_strings[i]; i++) { fprintf (message_file_ptr, "%s\n", help_prolog_strings[i]); } for (i = 0; i < midcommand; i++) { col = 0; col += fprintf (message_file_ptr, "%s", Gfft_Command[i].full_string); if (i + midcommand < end_command_number) { fputc (' ', message_file_ptr); while (++col < TAB_1) fputc (' ', message_file_ptr); col += fprintf (message_file_ptr, "%s", Gfft_Command[i + midcommand].full_string); if (i + midcommand*2 < end_command_number) { fputc (' ', message_file_ptr); while (++col < TAB_2) fputc (' ', message_file_ptr); col += fprintf (message_file_ptr, "%s", Gfft_Command[i + midcommand*2].full_string); #if (TAB_COLUMNS == 4) if (i + midcommand*3 < end_command_number) { fputc (' ', message_file_ptr); while (++col < TAB_3) fputc (' ', message_file_ptr); col += fprintf (message_file_ptr, "%s", Gfft_Command[i + midcommand*3].full_string); } #endif } } fprintf (message_file_ptr,"\n"); } for (i = 0; help_epilog_strings[i]; i++) { fprintf (message_file_ptr, "%s\n", help_epilog_strings[i]); } if (message_file_ptr != stdout) { # ifdef AMIGA fclose (message_file_ptr); display_file (message_file_name, TRUE); # else display_file (message_file_ptr); fclose (message_file_ptr); # endif } return arguments; } #ifdef AMIGA static void display_file (char *filename, BOOLEAN delete) #else static void display_file (FILE *read_file) #endif { #ifdef AMIGA /* Run MORE command to display file in new shell */ char buffer[COMMAND_BUFFER_SIZE]; char command_file_name[MAX_PATH]; FILE *comfile_ptr; sprintf (command_file_name, "%s%d", MORE_COMMAND_FILE_NAME, ++count); comfile_ptr = fopen (command_file_name,"w"); if (!comfile_ptr) { error_message (CANT_CREATE_MORE_COMMAND_FILE); RAISE_ERROR (NOTHING_SPECIAL); /* longjmp outa here! */ } fprintf (comfile_ptr, "which >nil: more\n"); fprintf (comfile_ptr, "if warn\n"); fprintf (comfile_ptr, "if exists sys:utilities\n"); fprintf (comfile_ptr, "path >nil: sys:utilities add\n"); fprintf (comfile_ptr, "endif\n"); fprintf (comfile_ptr, "endif\n"); fprintf (comfile_ptr, "more %s\n", filename); fprintf (comfile_ptr, "failat 100\n"); if (delete) { fprintf (comfile_ptr, "delete >nil: %s QUIET\n", filename); } fprintf (comfile_ptr, ";The following is to delete EARLIER scripts still hanging around.\n"); fprintf (comfile_ptr, "delete >nil: %s QUIET\n", COMMAND_FILE_WILDCARD); /* delete OLDer versions */ fprintf (comfile_ptr, "endcli\n"); fclose (comfile_ptr); sprintf (buffer, "newshell CON:0/0/%d/%d/Gfft-More-Shell from %s", Shell_Width, Shell_Height, command_file_name); system (buffer); #else /* Display file directly in current shell */ message___read_file = read_file; display_iterate (next_file_line); #endif } static void more_strings (char **message_strings) { #ifdef AMIGA /* Use MORE command to display strings in new shell */ FILE *message_file_ptr; char message_file_name[MAX_PATH]; int i; sprintf (message_file_name, "%s%d", MESSAGE_FILE_NAME, ++count); message_file_ptr = fopen (message_file_name,"w"); if (!message_file_ptr) { error_message (CANT_CREATE_MESSAGE_FILE); RAISE_ERROR (NOTHING_SPECIAL); /* longjmp outa here! */ } for (i = 0; message_strings[i]; i++) { fprintf (message_file_ptr, "%s\n", message_strings[i]); } fclose (message_file_ptr); display_file (message_file_name, TRUE); #else /* Display strings in current shell */ display_strings (message_strings); #endif } static void display_strings (char **message_strings) { message___strings = message_strings; message___string_index = 0; display_iterate (next_string); message___strings = NULL; } static char *next_file_line (void) { int i = 0; int c; static ff_found = FALSE; if (ff_found) { ff_found = FALSE; message___message_buf[0] = '\f'; message___message_buf[1] = '\0'; return message___message_buf; } while (EOF != (c = getc (message___read_file))) { if (c == '\n') { break; } if (c == '\f') { ff_found = TRUE; break; } message___message_buf[i] = (char) c; if (++i >= MESSAGE_IOBUFFER_SIZE - 1) { break; } } message___message_buf[i] = '\0'; if (c == EOF && i == 0) { return NULL; } else { return message___message_buf; } } static char *next_string (void) { char *string = NULL; if (message___strings) { if (message___strings[message___string_index]) { string = message___strings[message___string_index++]; } else { message___strings = NULL; } } return string; } static void display_iterate (char *iterator_function(void)) { char input_line[MESSAGE_IOBUFFER_SIZE]; char *message_string; int i = 0; while (message_string = (*iterator_function)()) { if (++i > PAGE_SIZE) { printf ("\n%s",MORE_STRING); gets (input_line); if (strlen(input_line) > 0 && (input_line[0] == NO_MORE_CHAR_1 || input_line[0] == NO_MORE_CHAR_2)) { break; } printf("\n"); i = 1; } if (message_string[0] == '\f') { printf ("\n"); i = PAGE_SIZE; } else { printf ("%s\n",message_string); } } } void command_error_message (int message_number, char *bad_charp) { long spaces; if (Quiet) return; if (CommandMode != WORKBENCH_MODE) { spaces = strlen (PROMPT) + (bad_charp - Command); if (CommandMode != INTERACTIVE_MODE) { fprintf (stderr,"%s\n",Command); spaces -= strlen (PROMPT); } for (; spaces > 0; spaces--) { fprintf (stderr," "); } fprintf (stderr,"^\n"); } error_message (message_number); } void error_message (int message_number) { /* * Since all messages herein are error messages * They are all written to stderr (or, output to a window) */ char *message_string; Error_Count++; switch (message_number) { case NO_SUCH_COMMAND: message_string = NO_SUCH_COMMAND_S; break; case OUT_OF_MEMORY: message_string = OUT_OF_MEMORY_S; break; case REQUESTER_STACK_OVERFLOW: message_string = REQUESTER_STACK_OVERFLOW_S; break; case UNSUPPORTED_COMMAND: message_string = UNSUPPORTED_COMMAND_S; break; case MISSING_ARGUMENT: message_string = MISSING_ARGUMENT_S; break; case BAD_ARGUMENT: message_string = BAD_ARGUMENT_S; break; case ALREADY_IN_CLI_MODE: message_string = ALREADY_IN_CLI_MODE_S; break; case BAD_NAME: message_string = BAD_NAME_S; break; case AMBIGUOUS_COMMAND: message_string = AMBIGUOUS_COMMAND_S; break; case BACKUP_CREATED: message_string = BACKUP_CREATED_S; break; case OUTPUT_BACKUP_FAILURE: message_string = OUTPUT_BACKUP_FAILURE_S; break; case CANT_CREATE_OUTPUT_FILE: message_string = CANT_CREATE_OUTPUT_FILE_S; break; case CANT_CLEANUP_BATCH_PLOT: message_string = CANT_CLEANUP_BATCH_PLOT_S; break; case CANT_RE_OUTPUT: message_string = CANT_RE_OUTPUT_S; break; case CANT_RE_PLOT: message_string = CANT_RE_PLOT_S; break; case BACKUP_OVERWRITTEN: message_string = BACKUP_OVERWRITTEN_S; break; case CANT_OPEN_INPUT_FILE: message_string = CANT_OPEN_INPUT_FILE_S; break; case SCANNING_FILE: if (CommandMode == WORKBENCH_MODE) return; /* redundant here */ message_string = SCANNING_FILE_S; break; case NO_DATA_PRESENT: message_string = NO_DATA_PRESENT_S; break; case PADDING_TAILEND: return; /* Now a non-default option */ /* message_string = PADDING_TAILEND_S; */ /* break; */ case AMBIGUOUS_ARGUMENT: message_string = AMBIGUOUS_ARGUMENT_S; break; case NO_SUCH_ARGUMENT: message_string = NO_SUCH_ARGUMENT_S; break; case NO_NUMERICAL: message_string = NO_NUMERICAL_S; break; case INVALID_NUMBER: message_string = INVALID_NUMBER_S; break; case IGNORING_TAILEND: message_string = IGNORING_TAILEND_S; break; case INSUFFICIENT_DATA: message_string = INSUFFICIENT_DATA_S; break; case FILENAME_TOO_LONG: message_string = FILENAME_TOO_LONG_S; break; case NO_RATE_SPECIFIED: message_string = NO_RATE_SPECIFIED_S; break; case NO_READ_FILE: message_string = NO_READ_FILE_S; break; case UNSUPPORTED_FORMAT: message_string = UNSUPPORTED_FORMAT_S; break; case TOOLTYPE_ERROR: message_string = TOOLTYPE_ERROR_S; break; case STARTUP_FILE_ERROR: message_string = STARTUP_FILE_ERROR_S; break; case CORRUPT_IFF: message_string = CORRUPT_IFF_S; break; case CORRUPT_AVR: message_string = CORRUPT_AVR_S; break; case COMPRESSION_NOT_SUPPORTED: message_string = COMPRESSION_NOT_SUPPORTED_S; break; case ONESHOT_BUT_NOT_8SVX: message_string = ONESHOT_BUT_NOT_8SVX_S; break; case FORMAT_NOT_OK: message_string = FORMAT_NOT_OK_S; break; case NOT_ENOUGH_FRAMES: message_string = NOT_ENOUGH_FRAMES_S; break; case OCTAVE_NOT_PRESENT: message_string = OCTAVE_NOT_PRESENT_S; break; case CORRUPT_AIFF: message_string = CORRUPT_AIFF_S; break; case CORRUPT_AIFC: message_string = CORRUPT_AIFC_S; break; case NO_WRITE_FILE: message_string = NO_WRITE_FILE_S; break; case DB_OF_ZERO: message_string = DB_OF_ZERO_S; break; case NO_FILE_REQSTR: message_string = NO_FILE_REQSTR_S; break; case SPEC_CHANNEL_UNAVAIL: message_string = SPEC_CHANNEL_UNAVAIL_S; break; case INVALID_BINS_SPEC: message_string = INVALID_BINS_SPEC_S; break; case INVALID_INTERLEAVE_SPEC: message_string = INVALID_INTERLEAVE_SPEC_S; break; case INVALID_SMOOTHING_SPEC: message_string = INVALID_SMOOTHING_SPEC_S; break; case INVALID_TIMESEG_PARAMETERS: message_string = INVALID_TIMESEG_PARAMETERS_S; break; case MISSING_TIMESEG_PARAMETERS: message_string = MISSING_TIMESEG_PARAMETERS_S; break; case CANT_CREATE_PLOTTER_FILE: message_string = CANT_CREATE_PLOTTER_FILE_S; break; case CANT_CREATE_MORE_COMMAND_FILE: message_string = CANT_CREATE_MORE_COMMAND_FILE_S; break; case CANT_CREATE_MESSAGE_FILE: message_string = CANT_CREATE_MESSAGE_FILE_S; break; case HELP_MESSAGE_UNAVAILABLE: message_string = HELP_MESSAGE_UNAVAILABLE_S; break; case HELP_FILE_NOT_FOUND: message_string = HELP_FILE_NOT_FOUND_S; break; case CANT_PLOT_FROM_STDOUT: message_string = CANT_PLOT_FROM_STDOUT_S; break; case INVALID_ROTATION_SPEC: message_string = INVALID_ROTATION_SPEC_S; break; case CHANGED_FORMAT_DEP_VALUE: message_string = CHANGED_FORMAT_DEP_VALUE_S; break; case INVALID_CALIBRATION_FILE: message_string = INVALID_CALIBRATION_FILE_S; break; case CANT_OPEN_INTUITION: message_string = CANT_OPEN_INTUITION_S; break; case WINDOW_OPEN_FAILED: message_string = WINDOW_OPEN_FAILED_S; break; default: message_string = UNDOCUMENTED_ERROR_S; break; } error_message_display (message_string, stderr); } static void error_message_display (char *message_string, FILE *output_ptr) { if (Quiet) return; #ifdef AMIGA if (CommandMode == WORKBENCH_MODE && dialog_window_p) { message_requester (dialog_window_p, message_string); } else #endif { fprintf (output_ptr, "%s\n", message_string); } } static void message_display (char *message_string, FILE *output_ptr) { if (Quiet) return; #ifdef AMIGA if (CommandMode == WORKBENCH_MODE && dialog_window_p) { message_gadget__write (message_gadgetp, message_string, dialog_window_p); } else #endif { fprintf (output_ptr, "%s\n", message_string); } } void loop_time_message (double seconds) { char time_string[160]; if (Quiet) return; sprintf (time_string, "FFT loop elapsed time (sec): %-11.5g Now writing fft data...", seconds); message_display (time_string, stdout); } void loop_time_message_done (double seconds) { char time_string[160]; if (Quiet) return; sprintf (time_string, "FFT loop elapsed time (sec): %-11.5g Ready for next analysis.", seconds); message_display (time_string, stdout); } void bins_d_message (unsigned long total_actually_read, unsigned long number_bins) { if (Quiet) return; /* * In workbench mode, gadget shows maximum value all the time * (at least, for formatted files) */ if (CommandMode != WORKBENCH_MODE || FileFormat == UNFORMATTED) { char message_string[MESSAGE_BUFSIZE]; sprintf (message_string, BINS_DETERMINED_S, total_actually_read, number_bins); message_display (message_string, stdout); } } void bins_s_message (void) { char message_string[MESSAGE_BUFSIZE]; if (Quiet) return; sprintf (message_string, BINS_SELECTED_S, NumberBins); message_display (message_string, stdout); } char *settings_message (char *arguments) { printf ("Synopsis: \n"); if (ReadPtr == stdin) { printf (KEYBOARD_INPUT_S); } else { if (ReadName && ReadName != NullString) { printf (INPUT_FILENAME_S, ReadName); if (StartByte) { printf (STARTBYTE_S, StartByte); } } } if (WritePtr == stdout) { printf (OUTPUT_SCREEN_S); } else if (WriteName && WriteName != NullString) { printf (OUTPUT_FILENAME_S,WriteName); } if (Rate) { printf (SAMPLING_RATE_S); #ifdef _FFP printf ("%-15.8g\n", Rate); #else printf ("%-19.12g\n", Rate); #endif } else { error_message (NO_RATE_SPECIFIED); } if (Numerical) { printf (NUMERICAL_RECIPES_USED_S); } if (Amplitude) { printf (AMPLITUDE_SPECTRUM_S); } if (Power) { printf (POWER_SPECTRUM_S); } if (!Power && !Amplitude) { printf (FFT_S); } else { if (Mean) { printf (MEAN_NORMALIZED_S); } else { printf (SUMMED_S); } if (NumberBins < 0) { printf (DEFAULT_BINS_S); } else { printf (BINS_S, NumberBins); } switch (WindowType) { case RECTANGLE_WINDOW: printf (RECTANGLE_WINDOWS_S); break; case HANN_WINDOW: printf (HANN_WINDOWS_S); break; case PARZEN_WINDOW: printf (PARZEN_WINDOWS_S); break; case WELCH_WINDOW: printf (WELCH_WINDOWS_S); break; case TRIANGLE_WINDOW: printf (TRIANGLE_WINDOWS_S); break; case HAMMING_WINDOW: printf (HAMMING_WINDOWS_S); break; case BLACKMAN_HARRIS_74DB_WINDOW: printf (BLACKMAN_HARRIS_74DB_WINDOWS_S); break; case BLACKMAN_HARRIS_92DB_WINDOW: printf (BLACKMAN_HARRIS_92DB_WINDOWS_S); break; } if (Overlap) { printf (OVERLAP_S); } else { printf (NO_OVERLAP_S); } if (Interleave > 1) { printf (INTERLEAVE_S); } if (Pink) { printf (PINK_S); } } if (HighFrequency != HIGHEST_FREQUENCY) { printf (MAX_FREQUENCY_S, HighFrequency); } if (LowFrequency != LOWEST_FREQUENCY) { printf (MIN_FREQUENCY_S, LowFrequency); } printf ("\nList of non-default settings:\n"); write_settings (stdout, NullString, TRUE, TRUE); return arguments; }