diff options
Diffstat (limited to 'mdk-stage1/slang/slcmd.c')
| -rw-r--r-- | mdk-stage1/slang/slcmd.c | 351 | 
1 files changed, 0 insertions, 351 deletions
| diff --git a/mdk-stage1/slang/slcmd.c b/mdk-stage1/slang/slcmd.c deleted file mode 100644 index 4a00a90fc..000000000 --- a/mdk-stage1/slang/slcmd.c +++ /dev/null @@ -1,351 +0,0 @@ -/* cmd line facility for slang */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#if SLANG_HAS_FLOAT -# include <math.h> -#endif - -#include "slang.h" -#include "_slang.h" - -#ifndef HAVE_STDLIB_H -/* Oh dear.  Where is the prototype for atof?  If not in stdlib, then - * I do not know where.  Not in math.h onsome systems either. - */ -extern double atof (); -#endif - -static SLcmd_Cmd_Type *SLcmd_find_command (char *s, SLcmd_Cmd_Type *cmd) -{ -   char *cmdstr; -   char chs = *s++, ch; - -   while ((cmd->cmdfun != NULL) -	  && (NULL != (cmdstr = cmd->cmd)) -	  && (0 != (ch = *cmdstr++))) -     { -	if ((ch == chs) && !strcmp (s, cmdstr)) return cmd; -	cmd++; -     } -   return NULL; -} - -static int extract_token (char **strptr, char *buf) -{ -   char *s, *b; -   char ch, quote; - -   *buf = 0; - -   s = *strptr; -   while (((ch = *s) != 0) -	  && ((ch == ' ') || (ch == '\t') || (ch == '\n'))) -     s++; - -   *strptr = s; - -   if (ch == 0) return 0; -   if (ch == '%') return 0; - -   b = buf; - -   *b++ = ch; -   s++; - -   if ((ch == '\'') || (ch == '"')) -     { -	quote = ch; -	while ((ch = *s) != 0) -	  { -	     s++; -	     *b++ = ch; -	     if (ch == quote) -	       break; - -	     if (ch == '\\') -	       { -		  if (0 == (ch = *s)) -		    break; -		  *b++ = ch; -		  s++; -	       } -	  } -	*strptr = s; -	*b = 0; -	return 1; -     } - -   while (((ch = *s) != 0) -	  && (ch != ' ') -	  && (ch != '\t') -	  && (ch != '\n') -	  && (ch != '%')) -     *b++ = *s++; - -   *strptr = s; -   *b = 0; -   return 1; -} - -static int allocate_arg_space (SLcmd_Cmd_Table_Type *table, int argc, unsigned int *space_ptr) -{ -   unsigned int space = *space_ptr; -   char *p; - -   if (argc + 1 < (int) space) -     return 0; - -   if (space > 128) -     { -	if (space > 1024) space += 1024; -	else space += 128; -     } -   else space += 32; - -   if (NULL == (p = SLrealloc ((char *)table->string_args, space * sizeof (char *)))) -     return -1; -   table->string_args = (char **)p; -   table->string_args [argc] = NULL; - -   if (NULL == (p = SLrealloc ((char *)table->int_args, space * sizeof (int)))) -     return -1; -   table->int_args = (int *)p; - -   if (NULL == (p = SLrealloc ((char *)table->double_args, space * sizeof (double)))) -     return -1; -   table->double_args = (double *)p; - -   if (NULL == (p = SLrealloc ((char *)table->arg_type, space * sizeof (unsigned char)))) -     return -1; -   table->arg_type = (unsigned char *)p; - -   *space_ptr = space; -   return 0; -} - -int SLcmd_execute_string (char *str, SLcmd_Cmd_Table_Type *table) -{ -   char *s, *b = NULL, *arg_type, *last_str, *cmd_name; -   SLcmd_Cmd_Type *cmd; -   char *buf; -   int token_present; -   int i; -   int status; -   unsigned int len; -   int argc; -   unsigned int space; - -   table->argc = 0; -   table->string_args = NULL; -   table->int_args = NULL; -   table->double_args = NULL; -   table->arg_type = NULL; - -   buf = SLmake_string (str); -   if (buf == NULL) -     return -1; - -   status = extract_token (&str, buf); -   if (status <= 0) -     { -	SLfree (buf); -	return status; -     } - -   if (((len = strlen (buf)) >= 32) -       || (NULL == (cmd = SLcmd_find_command (buf, table->table)))) -     { -	SLang_verror (SL_UNDEFINED_NAME,"%s: invalid command", buf); -	SLfree (buf); -	return -1; -     } - -   if (NULL == (cmd_name = SLmake_string (buf))) -     { -	SLfree (buf); -	return -1; -     } - -   space = 0; -   argc = 0; -   if (-1 == allocate_arg_space (table, argc, &space)) -     { -	SLfree (buf); -	return -1; -     } -   table->arg_type[argc] = SLANG_STRING_TYPE; -   table->string_args[argc++] = cmd_name; - -   arg_type = cmd->arg_type; -   status = -1; -   while (*arg_type) -     { -	int guess_type = 0; - -	last_str = str; - -	if (-1 == allocate_arg_space (table, argc, &space)) -	  goto error; - -	if (-1 == (token_present = extract_token (&str, buf))) -	  goto error; - -	table->string_args[argc] = NULL; - -	if (token_present) -	  { -	     b = buf; -	     len = strlen (b); - -	     if ((*b == '"') && (len > 1)) -	       { -		  b++; -		  len -= 2; -		  b[len] = 0; -		  guess_type = SLANG_STRING_TYPE; -		  SLexpand_escaped_string (buf, b, b + len); -		  len = strlen (buf); -	       } -	     else if ((*b == '\'') && (len > 1)) -	       { -		  char ch; -		  b++; -		  len -= 2; -		  b[len] = 0; -		  guess_type = SLANG_INT_TYPE; -		  ch = *b; -		  if (ch == '\\') -		    (void) _SLexpand_escaped_char (b, &ch); -		  sprintf (buf, "%d", (unsigned char) ch); -		  len = strlen (buf); -	       } -	     else guess_type = SLang_guess_type (buf); -	  } - -	switch (*arg_type++) -	  { -	     /* variable argument number */ -	   case 'v': -	     if (token_present == 0) break; -	   case 'V': -	     if (token_present == 0) -	       { -		  SLang_verror (SL_INVALID_PARM, "%s: Expecting argument", cmd_name); -		  goto error; -	       } - -	     while (*last_str == ' ') last_str++; -	     len = strlen (last_str); -	     str = last_str + len; - -	     s = SLmake_nstring (last_str, len); -	     if (s == NULL) goto error; - -	     table->arg_type[argc] = SLANG_STRING_TYPE; -	     table->string_args[argc++] = s; -	     break; - -	   case 's': -	     if (token_present == 0) break; -	   case 'S': -	     if (token_present == 0) -	       { -		  SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting string argument", cmd_name); -		  goto error; -	       } - -	     s = SLmake_nstring (buf, len); -	     if (s == NULL) goto error; -	     table->arg_type[argc] = SLANG_STRING_TYPE; -	     table->string_args[argc++] = s; -	     break; - -	     /* integer argument */ -	   case 'i': -	     if (token_present == 0) break; -	   case 'I': -	     if ((token_present == 0) || (SLANG_INT_TYPE != guess_type)) -	       { -		  SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting integer argument", cmd_name); -		  goto error; -	       } - -	     table->arg_type[argc] = SLANG_INT_TYPE; -	     table->int_args[argc++] = SLatoi((unsigned char *) buf); -	     break; - -	     /* floating point arg */ -#if SLANG_HAS_FLOAT -	   case 'f': -	     if (token_present == 0) break; -	   case 'F': -	     if ((token_present == 0) || (SLANG_STRING_TYPE == guess_type)) -	       { -		  SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting double argument", cmd_name); -		  goto error; -	       } -	     table->arg_type[argc] = SLANG_DOUBLE_TYPE; -	     table->double_args[argc++] = atof(buf); -	     break; -#endif -	     /* Generic type */ -	   case 'g': -	     if (token_present == 0) break; -	   case 'G': -	     if (token_present == 0) -	       { -		  SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting argument", cmd_name); -		  goto error; -	       } - -	     switch (guess_type) -	       { -		case SLANG_INT_TYPE: -		  table->arg_type[argc] = SLANG_INT_TYPE; -		  table->int_args[argc++] = SLatoi((unsigned char *) buf); -		  break; - -		case SLANG_STRING_TYPE: -		  s = SLmake_nstring (buf, len); -		  if (s == NULL) goto error; - -		  table->arg_type[argc] = SLANG_STRING_TYPE; -		  table->string_args[argc++] = s; -		  break; -#if SLANG_HAS_FLOAT -		case SLANG_DOUBLE_TYPE: -		  table->arg_type[argc] = SLANG_DOUBLE_TYPE; -		  table->double_args[argc++] = atof(buf); -#endif -	       } -	     break; -	  } -     } - -   /*                 call function */ -   status = (*cmd->cmdfun)(argc, table); - -   error: -   if (table->string_args != NULL) for (i = 0; i < argc; i++) -     { -	if (NULL != table->string_args[i]) -	  { -	     SLfree (table->string_args[i]); -	     table->string_args[i] = NULL; -	  } -     } -   SLfree ((char *)table->string_args); table->string_args = NULL; -   SLfree ((char *)table->double_args); table->double_args = NULL; -   SLfree ((char *)table->int_args); table->int_args = NULL; -   SLfree ((char *)table->arg_type); table->arg_type = NULL; - -   SLfree (buf); -   return status; -} - | 
