home *** CD-ROM | disk | FTP | other *** search
- /***************************************************************************
- * 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: name.c
- * Purpose: identify name and/or invoke method on it
- * Author: Charles Peterson (CPP)
- * History: 30-May-1993 CPP; Created.
- * Comments: (1) Error display puts a (^) below first bad character
- */
-
- #include <strings.h>
- #include <stdio.h>
- #include <ctype.h>
- #include "gfft.h"
- #include "errcodes.h"
-
- static int cindex = 0;
-
- Name_Info_St *invoke_method (char *command,
- Name_Info_St *command_name_list)
- {
- Name_Info_St *this_command;
- char *argument_string;
-
- this_command = identify_name (command, command_name_list, TRUE);
- if (command[cindex] == '\0')
- {
- argument_string = &command[cindex];
- }
- else
- {
- argument_string = &command[ cindex + 1];
- }
- (*this_command->cfunction) (argument_string);
- return this_command;
- }
-
-
- /*
- * if report_error is TRUE,
- * there will be no direct return on error
- * only longjmp
- */
- Name_Info_St *identify_name (char *command,
- Name_Info_St *command_name_list,
- BOOLEAN report_error)
- {
- int i;
- int lastmatch = 0;
- int error_code = NO_SUCH_COMMAND;
- int command_offset;
-
- if (command[0] == '\0')
- {
- if (report_error)
- {
- RAISE_ERROR (NOTHING_SPECIAL); /* longjmp outa here! */
- }
- else
- {
- return NULL;
- }
- }
-
- for (i = 0; strlen (command_name_list[i].full_string); i++)
- {
- /*
- * First, find a minimum string that matches
- */
- cindex = 0;
- while (command[cindex] && command_name_list[i].min_string[cindex] &&
- command[cindex] != ' ' &&
- toupper (command[cindex]) == toupper
- (command_name_list[i].min_string[cindex]))
- {
- cindex++;
- if (cindex > lastmatch)
- {
- lastmatch = cindex;
- }
- }
- if (command_name_list[i].min_string[cindex] != '\0')
- {
- if (command[cindex] == '\0' || command[cindex] == ' ')
- {
- error_code = AMBIGUOUS_COMMAND;
- }
- continue;
- }
- /*
- * Then, insure that following characters don't mismatch
- */
- while (command[cindex] && command_name_list[i].full_string[cindex] &&
- command[cindex] != ' ' &&
- toupper (command[cindex]) == toupper
- (command_name_list[i].full_string[cindex]))
- {
- cindex++;
- if (cindex > lastmatch)
- {
- lastmatch = cindex;
- }
- }
- if (command[cindex] == '\0' || command[cindex] == ' ')
- {
- return &command_name_list[i]; /* SUCCESSFUL return */
- }
- continue;
- }
- /*
- * No command has matched completely!
- */
- command_offset = command - Command;
- if (command_offset)
- {
- if (error_code == NO_SUCH_COMMAND)
- {
- error_code = NO_SUCH_ARGUMENT;
- }
- else if (error_code == AMBIGUOUS_COMMAND)
- {
- error_code = AMBIGUOUS_ARGUMENT;
- }
- }
- if (report_error)
- {
- command_error_message (error_code, command + lastmatch);
- RAISE_ERROR (NOTHING_SPECIAL); /* longjmp outa here! */
- }
- else
- {
- return NULL;
- }
- /*
- * all returns or jumps above
- */
- }
-