/* * Simulator of microcontrollers (cmd.src/cmdutil.cc) * * Copyright (C) 1999,99 Drotos Daniel, Talker Bt. * * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu * */ /* This file is part of microcontroller simulator: ucsim. UCSIM is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. UCSIM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with UCSIM; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /*@1@*/ #include "ddconfig.h" #include #include #include #include #include #include "i_string.h" #include "stypes.h" #include "globals.h" #include "uccl.h" #include "cmdutil.h" /* * Processing escape sequencies in a string */ char * proc_escape(char *string, int *len) { char spec_chars[]= "fnrtvab\""; char spec[]= "\f\n\r\t\v\a\b\""; char *s, *str, *p; s = string; str= (char *)malloc(strlen(string)+1); p = str; while (*s) { char *spec_c; if (*s == '\\' && *(s+1)) { s++; if (*s == '0') { if (!isdigit(*(s+1))) { *p++= '\0'; s++; } else { char *octal, *chk, data; int i, j; i= strspn(s, "01234567"); octal= (char *)malloc(i+1); j= 0; while (*s && (j < i)) octal[j++]= *s++; octal[j]= '\0'; data= strtol(octal, &chk, 8); if (!chk || !(*chk)) *p++= data; } } else if ((spec_c= strchr(spec_chars, *s)) != NULL) { *p++= spec[spec_c-spec_chars]; s++; } else *p++= *s++; } else *p++= *s++; } *p= '\0'; *len= p-str; return(str); } extern "C" int vasprintf(char **strp, const char *format, va_list ap); extern "C" int vsnprintf(char *str, size_t size,const char *format,va_list ap); int cmd_vfprintf(FILE *f, char *format, va_list ap) { int ret, i; if (!f) return(0); #ifdef HAVE_VASPRINTF char *msg= NULL; i= vasprintf(&msg, format, ap); if (i < 0) ; ret= fprintf(f, "%s", msg); free(msg); #else char msg[80*25]; i= vsnprintf(msg, 80*25, format, ap); if (i < 0) ; ret= fprintf(f, "%s", msg); #endif fflush(f); return(ret); } int cmd_fprintf(FILE *f, char *format, ...) { va_list ap; va_start(ap, format); int ret= cmd_vfprintf(f, format, ap); va_end(ap); return(ret); } int bool_name(char *s, int *val) { int v= 0; if (!s || !*s) return 0; if (strspn(s, "0nNfF") > 0) { if (val) *val= 0; return 1; } if (strspn(s, "1yYtT") > 0) { if (val) *val= 1; return 1; } if (strspn(s, "oO") == 1) { if (toupper(s[1]) == 'N') v= 1; else if (toupper(s[1]) == 'F') v= 0; else return 0; if (val) *val= v; return 1; } return 0; } /* End of cmd.src/cmdutil.cc */