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

📄 int_str.c

📁 LastWave
💻 C
📖 第 1 页 / 共 4 页
字号:
  SetStrVariable(name,str);}/* * Setting a string variable with a list */void SetStrVariableListLevel(LEVEL level,char *name,char **list,char flagBracket){  VARIABLE v;  HASHTABLE t;  char *left,flag,*type;  VALUE *pcont,value;  STRVALUE sc;  int size,l;  char **list1 = list;    while (level->levelVar != level) level = level->levelVar;  t = level->theVariables;    /* Get the variable (eventually creates it) */  v = GetVariableHT(&t, YES, name, &left, &flag);  if (v==NULL || flag != 0 || *left != '\0') Errorf1("");  /* Get a pointer to the content and the type */  pcont =  GetVariablePContent(v, NO);  value = *pcont;  type = GetTypeValue(value);    /* Check overwriting */  if (!DoesTypeOverwrite(type,listType))     Errorf("SetStrVariableListLevel() : Cannot overwrite variable '%s' of type '%s' with '%s' typed value",name,type,listType);  /* If the content is a strType can we use it ? */  if (type == strType && (*pcont)->nRef == 1) {}  else {    /* Delete the content */    DeleteValue(*pcont);    /* Create it */    *pcont = (VALUE) NewStrValue();    value = *pcont;  }  sc = (STRVALUE) value;      /* Computing the size the result will take */  l = 0;  size = 0;  list1 = list;  while(*list1 != NULL) {    size += strlen(*list1) + 3;    list1++;  }     /* Allocation ? */  if (size > l && size > MinStringSize-1) {    Free(sc->str);    sc->str = StrValueStrAlloc(size);  }  if (sc->list) {    Free(sc->list);    sc->list = NULL;  }  /* Setting the result ???????? optimiser */  sc->str[0] = '\0';  list1 = list;  while(*list1 != NULL) {    if (!flagBracket || **list1 != '\0' && !IsList(*list1)) strcat(sc->str,*list1);    else {      strcat(sc->str,"{");      strcat(sc->str,*list1);      strcat(sc->str,"}");    }    if (*(list1+1) != NULL) strcat(sc->str," ");    list1++;  }  sc->list = CopyList(list);  }void SetStrVariableList(char *name,char **list, char flagBracket){  SetStrVariableListLevel(levelCur,name,list,YES);} /****************************************** *  * The string command and string regexp * ******************************************//* * Subroutine pour le matching d'une chaine par une regexp * * Cherche a matcher le debut de la chaine et renvoie  * la chaine matchee la plus grande possible ! * * renvoie le dernier caractere non matche */static char *start;static char *end; static char *MatchStr_(char *str,char *expr){  int i;  char *expr1,*expr0,*str1,*res;  static char tok[100];  char flag0Repeat,flag1Repeat,flag01Repeat,flagInclude;  char *start1,*end1;    while (1) {    switch(*expr) {    /* end of string */    case '$' :        if (str[0] != '\0') return(NULL);      if (expr[1] != '\0') Errorf("MatchStr_ : the character '$' must be at the end of the regexp");      return(str);        /* Case of a '*' character */    case '*' :       switch (expr[1]) {      case '\0' : return(str+strlen(str));              default :        i = strlen(str);        while(1) {          start1 = start;          end1 = end;          res = MatchStr_(str+i,expr+1);          if (res) return(res);          start = start1;          end = end1;          if (i == 0) return(NULL);          i--;        }          }    /* Case of a '+' character */    case '+' :       switch (expr[1]) {      case '\0' :         if (*str == '\0') return(NULL);        return(str);      default :         i = strlen(str);        while(1) {          res = MatchStr_(str+i,expr+1);          start1 = start;          end1 = end;          if (res) return(res);          start = start1;          end = end1;          if (i == 1) return(NULL);          i--;        }          }    /* Case of a "[", "[*", "[^" and "[*^" string */    case '[' :          /* Get the flags */      expr0 = expr;     /* expr0 --> '[' */      expr++;      flag0Repeat = flag1Repeat = flag01Repeat = NO;      switch (*expr) {      case '*' : flag0Repeat = YES; expr++; break;      case '#' : flag01Repeat = YES; expr++; break;      case '+' : flag1Repeat = YES; expr++; break;      }      if (*expr == '^') {flagInclude = NO; expr++;}      else flagInclude = YES;            /* Get the set of characters */      expr1 = expr;     /* expr1 --> first character */      if (*expr == ']') expr++;      while (*expr != ']' && *expr != '\0') expr++;  /* expr --> ] */      if (*expr == '\0') Errorf("MatchStr_() : Missing matching '[' in regexp '...%s'",expr0);      if (expr-expr1>90) Errorf("MatchStr_() : regexp between [] is too long");      strncpy(tok,expr1,expr-expr1);      tok[expr-expr1] = '\0';      expr++;            if (*str == '\0') {        if (flag0Repeat || flag01Repeat) continue;        return(NULL);      }            if (!flag0Repeat && !flag01Repeat) {        if (flagInclude) {          if (strchr(tok,*str) == NULL) return(NULL);                  }        else {          if (strchr(tok,*str) != NULL) return(NULL);                  }        str++;        if (!flag1Repeat) continue;        flag0Repeat = YES;      }      /* We must look for all the characters it could match */      str1 = str;      if (flag0Repeat) {        if (flagInclude) while(*str1 != '\0' && strchr(tok,*str1)) str1++;        else while(*str1 != '\0' && !strchr(tok,*str1)) str1++;      }      else {        if (flagInclude && *str1 != '\0' && strchr(tok,*str1)) str1++;        else if (!flagInclude && *str1 != '\0' && !strchr(tok,*str1)) str1++;      }              /* Then call recursively */      while (str<=str1) {        start1 = start;        end1 = end;        res = MatchStr_(str1,expr);        if (res) return(res);        start = start1;        end = end1;        str1--;      }      return(NULL);    /* Case of a '?' character */    case '?' :      if (str[0] == '\0') return(NULL);      str++;      expr++;      continue;    /* Case of a '|' character */    case '|' :      if (start == NULL) start = str;      else if (end == NULL) {        end = str;      }      else Errorf("MatchStr_ : Too many '|' (there must be at most 2 of them");       expr++;      continue;        /* ! */    case '!' :      expr++;      while (*str != '\0' && *expr != '\0' && *expr != '!') {        if (*expr == '\\' && expr[1] == '!') expr++;        if (*str != *expr) return(NULL);        expr++;        str++;        continue;      }      if (*expr == '\0') Errorf("MatchStr_ : bad regexp, missing a '!'");      if (*expr != '!') return(NULL);      expr++;      continue;    /* End of expr */    case '\0' :      return(str);            /* Match a character */        default :      if (*str != *expr) return(NULL);      str++;      expr++;      continue;    }      }}LISTV MatchStrN(char *str,char *expr, int nOcc){  char *res,*str0;  LISTV lv;  RANGE rg;  char *expr0;    expr0 = expr;      if (*expr == '^') expr++;  str0 = str;  lv = TNewListv();  while (1) {    if (*str == '\0') return(lv);    /* To go a little faster */    if (*expr0 != '|' && *expr0 != '^' && *expr != '\0' && *expr != '[' && *expr != '*' && *expr != '?'  && *expr != '+' && *expr != '$') {      if (*expr == '!') res = strchr(str,expr[1]);      else res = strchr(str,*expr);      if (res == NULL) return(lv);      str = res;    }    start = end = NULL;    res = MatchStr_(str,expr);    if (start == NULL) start = str;    if (end == NULL) end = res;    if (end == start+1 || end == start) {      AppendFloat2Listv(lv,start-str0);      nOcc--;    }    else if (end>start) {      rg = TNewRange();      rg->first = start-str0;      rg->size = end-start;      AppendValue2Listv(lv,(VALUE) rg);      nOcc--;    }    if (nOcc == 0) return(lv);        if (str[1] == '\0' || *expr0 == '^') return(lv);    if (res == NULL || res <= str) res = str+1;    str = res;  }}    char MatchStr(char *str,char *expr){  char *str1;  char *f;    SetTempAlloc();  str1 = CharAlloc(strlen(expr)+2); /* ????? bof */  TempPtr(str1);  strcpy(str1,expr);  str1[strlen(expr)]='$';  str1[strlen(expr)+1]='\0';  f = MatchStr_(str,str1);  ClearTempAlloc();  return(f!=NULL);  }  LISTV FindStr(char *str, char *subStr, int nOcc){  LISTV lv;  char *str0;  int n;  RANGE rg;    str0 = str;  n = strlen(subStr);  lv = NewListv();    while (1) {        while (1) {      str = strchr(str,*subStr);      if (str == NULL) break;      if (!strncmp(str,subStr,strlen(subStr))) break;      str++;    }    if (str==NULL) return(lv);    if (n == 1) {      AppendFloat2Listv(lv,str-str0);      nOcc--;    }    else {      rg = NewRange();      rg->first = str-str0;      rg->size = n;      AppendValue2Listv(lv, (VALUE) rg);      DeleteValue(rg);      nOcc--;    }        if (nOcc == 0) return(lv);        str += n;      }}/************************************************ * * Useful functions on strings * ************************************************//* * Managing allocations of strings *//* Delete a string */ void DeleteStr(char *str){  Free(str);}/* Copy a string */ char *CopyStr(char *str){  char *strOut;    if (str == NULL) Errorf("CopyStr() : cannot copy NULL string");    strOut = CharAlloc(strlen(str)+1);  strcpy(strOut,str);  return(strOut);}/* Copy a string and make it temporary */ char *TCopyStr(char *str){  char *strOut = CopyStr(str);  TempStr(strOut);  return(strOut);} /* Make a string temporary */void TempStr(char *str){  TempPtr(str);}/* ??? */#define LINELENGTH 80 void PrintStrColumn(char *str,int size){   static char spaces[]="                                                                                                        ";   static int nspaces = 100;   static int nspaces1 = 100;   static int countLine;  static int terminalLength = LINELENGTH;  static int tab = 0;  int length;  static char theString[1000];      if (str == NULL) {    if (size <= 0) {      Printf("%s\n",theString);      theString[0] = '\0';    }    else {      theString[0] = '\0';      tab = size;      countLine = 0;    }    return;  }    if (tab == 0) Errorf("PrintStrColumn() : you should initialize the call first");  length = tab * (1 + (int) strlen(str) / tab);  if (countLine+length >= terminalLength) {     Printf("%s\n",theString);     theString[0] = '\0';         countLine = 0;  }  countLine += length;      strcat(theString,str);    length -= strlen(str);    if (nspaces != nspaces1) {    spaces[nspaces1] = ' ';    nspaces1 = nspaces;  }    while (length > nspaces) {    strcat(theString,spaces);    length-=nspaces;  }  if (length < 0) return;  nspaces1 = length;  spaces[nspaces1] = '\0';  strcat(theString,spaces);  if (nspaces != nspaces1) {    spaces[nspaces1] = ' ';    nspaces1 = nspaces;  }}/************************************************ * * Command on strings * ************************************************/void C_Str(char **argv){  char *action,*str,*str1,*str3;  int i,n;  char c;  LISTV lv;  LWFLOAT f;  extern LWFLOAT GetListvNthFloat(LISTV lv,int n);  argv = ParseArgv(argv,tWORD,&action,-1);    if (!strcmp(action,"2ascii")) {    argv = ParseArgv(argv,tSTR,&str,0);    lv = TNewListv();    for (i=0;i<strlen(str);i++) AppendInt2Listv(lv,(int) str[i]);    SetResultValue(lv);    return;  }   /* ascii2 action */  else if (!strcmp(action,"ascii2")) {    argv = ParseArgv(argv,tLISTV,&lv,0);    for (i=0;i<lv->length;i++) {      f = GetListvNthFloat(lv,i);      if (f != (int) f || f < 0 || f >=256)         Errorf("Bad ascii code '%g'",f);      AppendResultf("%c",(char) f);    }    return;  }   /* match action */  else if (!strcmp(action,"match")) {    argv = ParseArgv(argv,tSTR,&str,tSTR,&str1,tINT_,-1,&n,0);      lv = MatchStrN(str,str1,n);    SetResultValue(lv);    return;  }    /* substr action */  else if (!strcmp(action,"substr")) {    argv = ParseArgv(argv,tSTR,&str,tSTR,&str1,tINT_,-1,&n,0);    lv = FindStr(str,str1,n);    TempValue( lv);    SetResultValue(lv);    return;  }  /* inter action */  else if (!strcmp(action,"inter")) {    argv = ParseArgv(argv,tSTR,&str,tSTR,&str1,0);    str3 = str;

⌨️ 快捷键说明

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