⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 int_parser.c

📁 LastWave
💻 C
📖 第 1 页 / 共 5 页
字号:
  name++;  while (*name != '\0' && IsValidSymbolChar(*name)) name++;  if (*name == '\0') return(YES);  return(NO);}char ParseSymbol_(char *arg, char *defVal, char **str){  *str = defVal;    if (arg == NULL) {    SetErrorf("ParseSymbol_() : NULL string cannot be converted to a symbol");    return(NO);  }    if (!IsValidSymbol(arg)) {    SetErrorf("ParseSymbol_() : '%s' not a valid symbol",arg);    return(NO);  }  *str = arg;  return(YES);}/* Same as above but generate an error (no default value) */void ParseSymbol(char *arg, char **i){  if (ParseSymbol_(arg,NULL,i) == NO) Errorf1("");}/*********************************************************************************** * *  Parsing a variable name just check that it starts with the right character * ***********************************************************************************/char ParseVName_(char *arg, char *defVal, char **str){  *str = defVal;    if (arg == NULL) {    SetErrorf("ParseVName_() : NULL string cannot be converted to a variable name");    return(NO);  }    if (!IsValidSymbolChar1(*arg)) {    SetErrorf("ParseVName_() : '%s' not a valid variable name",arg);    return(NO);  }  *str = arg;  return(YES);}/* Same as above but generate an error (no default value) */void ParseVName(char *arg, char **i){  if (ParseVName_(arg,NULL,i) == NO) Errorf1("");}/*********************************************************************************** * *  Parsing a string evaluated (no allocation)   * ***********************************************************************************/char ParseStrValueLevel_(LEVEL level, char *arg, STRVALUE defVal, STRVALUE *sc){  char *type;  LWFLOAT resFlt;  VALUE resVC;  *sc = defVal;    if (arg == NULL) {    SetErrorf("ParseStrLevel_() : NULL string cannot be converted to a string");    return(NO);  }    resVC = NULL;  type = TTEvalExpressionLevel_(level,arg,&resFlt,&resVC,StringType,NO,YES,AnyType,YES);  if (type == NULL) return(NO);  *sc = (STRVALUE) resVC;    return(YES);}/* Same as above but generate an error (no default value) */void ParseStrValueLevel(LEVEL level, char *arg, STRVALUE *sc){  if (ParseStrValueLevel_(level,arg,NULL,sc) == NO) Errorf1("");}char ParseStrLevel_(LEVEL level, char *arg, char *defVal, char **str){  char *type;  LWFLOAT resFlt;  VALUE resVC;  *str = defVal;    if (arg == NULL) {    SetErrorf("ParseStrLevel_() : NULL cannot be converted to a string");    return(NO);  }    resVC = NULL;  type = TTEvalExpressionLevel_(level,arg,&resFlt,&resVC,StringType,NO,YES,AnyType,YES);    if (type == NULL) return(NO);  *str = ((STRVALUE) resVC)->str;    return(YES);}/* Same as above but generate an error (no default value) */void ParseStrLevel(LEVEL level, char *arg, char **i){  if (ParseStrLevel_(level,arg,NULL,i) == NO) Errorf1("");}char ParseStr_(char *arg, char *defVal, char **str){  return(ParseStrLevel_(levelCur, arg,defVal,str));}/* Same as above but generate an error (no default value) */void ParseStr(char *arg, char **i){  if (ParseStr_(arg,NULL,i) == NO) Errorf1("");}/* * Parsing a LWFLOAT or a string * */char ParseFloatStrLevel_(LEVEL level,char *arg,LWFLOAT *f, char **str){  char *type;  VALUE val;  if (arg == NULL) {    SetErrorf("ParseFloatStrLevel_() : NULL cannot be converted to a LWFLOAT or string");    return(NO);  }    type = TTEvalExpressionLevel_(level,arg,f,&val,StringType | FloatType,NO,NO,AnyType,YES);    if (type == NULL) return(NO);    if (type == strType) *str = ((STRVALUE) val)->str;  else {    *str = NULL;    if (val != NULL) *f = ((NUMVALUE) val)->f;  }  return(YES);}  /***************************************************************** * * * *  Parsing of a list (with special characters " and {}) * * * *****************************************************************/ /* Maximum number of imbricated brackets or quotes in a list */#define maxNImbricatedBrackets 200/*  * 'theLine' starts with a { or " and it returns the corresponding } or " * It returns NULL if none  */char * LookForBracketList(char *theLine, char *line){  static char *brackets[maxNImbricatedBrackets];    int nBrackets;  char flagStop;  nBrackets = 0;  brackets[nBrackets++] = line++;  flagStop = NO;    while (!flagStop && *line && nBrackets != 0) {    switch(*line) {      case '\\' :         if (*(++line) != '\0') line++;         break;      case '{':         if (nBrackets >= maxNImbricatedBrackets) {          SetErrorf("Too many imbricated brackets");          return(NULL);        }        brackets[nBrackets++] = line++;        break;            case '}':                 if (*(brackets[nBrackets-1]) != '{') flagStop = YES;        else {          line++;          nBrackets--;        }        break;      case '[':         if (*(brackets[nBrackets-1]) == '{') {line++; continue;}        if (*(brackets[nBrackets-1]) == '"' || *(brackets[nBrackets-1]) == '\'') {line++;break;}        if (*(brackets[nBrackets-1]) == '{') line++;        else brackets[nBrackets++] = line++;        break;            case ']':         if (*(brackets[nBrackets-1]) == '{') {line++; continue;}        if (*(brackets[nBrackets-1]) == '"' || *(brackets[nBrackets-1]) == '\'') {line++;break;}        if (*(brackets[nBrackets-1]) == '{') line++;        else if (*(brackets[nBrackets-1]) == '[') {          line++;          nBrackets--;        }        else flagStop = YES;        break;      case '(':         if (*(brackets[nBrackets-1]) == '{') {line++; continue;}        if (*(brackets[nBrackets-1]) == '"' || *(brackets[nBrackets-1]) == '\'') {line++;break;}        if (*(brackets[nBrackets-1]) == '{') line++;        else brackets[nBrackets++] = line++;        break;            case ')':         if (*(brackets[nBrackets-1]) == '{') {line++; continue;}        if (*(brackets[nBrackets-1]) == '"' || *(brackets[nBrackets-1]) == '\'') {line++;break;}        if (*(brackets[nBrackets-1]) == '{') line++;        else if (*(brackets[nBrackets-1]) == '(') {          line++;          nBrackets--;        }        else flagStop = YES;        break;      case '`':        if (*(brackets[nBrackets-1]) == '{') {line++; continue;}        if (*(brackets[nBrackets-1]) == '"' || *(brackets[nBrackets-1]) == '\'') {line++;break;}        if (*(brackets[nBrackets-1]) != '`') {          if (nBrackets >= maxNImbricatedBrackets) {            SetErrorf("Too many imbricated brackets");            return(NULL);          }          brackets[nBrackets++] = line++;        }        else {          line++;          nBrackets--;        }        break;      case '"':        if (*(brackets[nBrackets-1]) == '{') {line++; continue;}        if (*(brackets[nBrackets-1]) == '\'') {line++;break;}        if (*(brackets[nBrackets-1]) != '"') {          if (nBrackets >= maxNImbricatedBrackets) {            SetErrorf("Too many imbricated brackets");            return(NULL);          }          brackets[nBrackets++] = line++;        }        else {          line++;          nBrackets--;        }        break;      case '\'':        if (*(brackets[nBrackets-1]) == '{') {line++; continue;}        if (*(brackets[nBrackets-1]) == '"') {line++;break;}        if (*(brackets[nBrackets-1]) != '\'') {          if (nBrackets >= maxNImbricatedBrackets) {            SetErrorf("Too many imbricated brackets");            return(NULL);          }          brackets[nBrackets++] = line++;        }        else {          line++;          nBrackets--;        }        break;      default: line++;    }  }    if (nBrackets != 0) {    if (*(brackets[nBrackets-1]) == '`') SyntaxError("Missing the corresponding `",theLine,brackets[nBrackets-1]);    else if (*(brackets[nBrackets-1]) == '"') SyntaxError("Missing the corresponding \"",theLine,brackets[nBrackets-1]);    else if (*(brackets[nBrackets-1]) == '\'') SyntaxError("Missing the corresponding '",theLine,brackets[nBrackets-1]);    else if (*(brackets[nBrackets-1]) == '{') SyntaxError("Missing the corresponding }",theLine,brackets[nBrackets-1]);    else if (*(brackets[nBrackets-1]) == '[') SyntaxError("Missing the corresponding ]",theLine,brackets[nBrackets-1]);    return(NULL);  }  else return(line-1);} /*  * Get the corresponding character to an escape sequence in a list */static int GetCharFromEscapeList(char c){  switch (c) {    case '\\' : return('\\');    case '{' : return('{');    case '}' : return('}');    case '[' : return('[');    case ']' : return(']');    case '"' : return('"');    case '\'' : return('\'');    case 't' : return('\t');    case 'r' : return('\r');    case 'n' : return('\n');    default : return(-1);  }}/* Just test that we have enough allocation */#define TestAlloc(n) \  if ((n)+nNewLine > MaxLengthList) { \    SyntaxError("Word is too long",theLine,line); \    return(-1); \  }/* Just parses one character */#define Parse1Char(parseStr) { \   nNewLine++; \   TestAlloc(0); \   *newLine = *(parseStr); \   newLine++; \   parseStr++;}/* * *  The Main function for parsing a list * *    'theLine' = the total line (used in case of error) * *  returns arrays of the begining/end of words an in the variables beg and end *  and it returns the number of words or -1 if an error occured * */int ParseListBegEnd(char *theLine, char ***beg, char ***end){  static char *theBegWords[MaxNumWords+1];  static char *theEndWords[MaxNumWords+1];  static char theNewLine[MaxLengthList+1],*newLine;  int nWord;  char *line,*bracket,*lineError,*line1,*braceBeg,*braceEnd;  int nNewLine;  char *str;  char flagEscape,flagCreateWord,flagStop;  int i;  /* If line is NULL then error */  if (theLine == NULL) return(-1);  /* Set the result variables */      if (beg != NULL && end != NULL) {    *beg = theBegWords;    *end = theEndWords;  }  /*    * Some inits concerning the line    */  line = theLine;  while (*line == ' ' || *line == '\t' || (*line == '\\' && (line[1] == '\n' || line[1] == '\r'))) {    if (*line == '\\') {      if (line[1] == '\n' && line[2] == '\r' || line[1] == '\r' && line[2] == '\n') line += 3;      else line+=2;    }    else  line++;  }  /* If empty line */  if (*line == '\0') {    theBegWords[0] = theEndWords[0] = NULL;    return(0);  }    /* If {} surrounds the list we should set a flag */  braceBeg = NULL;  if (*line == '{') {    braceEnd = LookForBracketList(theLine,line);    if (braceEnd == NULL) return(-1);    line1 = braceEnd+1;    while (*line1 == ' ' || *line1 == '\t' || (*line1 == '\\' && (line1[1] == '\n' || line1[1] == '\r'))) line1++;    if (*line1 != '\0') {braceBeg = NULL; braceEnd= NULL;}    else {      braceBeg = line;      line1 = line+1;      while (*line1 == ' ' || *line1 == '\t' || (*line1 == '\\' && (line1[1] == '\n' || line1[1] == '\r'))) {        if (*line1 == '\\') {          if (line1[1] == '\n' && line1[2] == '\r' || line1[1] == '\r' && line1[2] == '\n') line1 += 3;          else line1+=2;        }        else line1++;      }      if (line1== braceEnd) {        theBegWords[0] = theEndWords[0] = NULL;        return(0);      }    }  }   /*    * Some inits concerning the processed line    */  *theNewLine = '\0';  newLine = theNewLine;  nNewLine = 0;  /*   * Other inits    */  nWord = 0;  flagEscape = 0;        flagStop = NO;   flagCreateWord = NO;    theBegWords[nWord] = NULL;  theEndWords[nWord] = NULL;    /*   * Let's loop on the characters    */  while(1) {    /*      * If we were asked to create a new word just do it      */    if (flagCreateWord) {          /* Let's end the word */             theEndWords[nWord] = (nNewLine != 0 ? newLine-1 : newLine);      nWord++;                  /* And init the next one */      theBegWords[nWord] = theEndWords[nWord] = NULL;      /* Skip spaces and tabs or escaped new lines */      while (*line == ' ' || *line == '\t' || (*line == '\\' && (line[1] == '\n' || line[1] == '\r'))) {        if (*line == '\\') {          if (line[1] == '\n' && line[2] == '\r' || line[1] == '\r' && line[2] == '\n') line += 3;          else line+=2;        }        else  line++;      }            flagCreateWord = NO;          }    /*     * Case we must exit the loop :      *   - end of the line     */    if (*line == '\0') {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -