Skip to content
c
#define  TRUE         1
#define  FALSE        0
#define  OK           1
#define  ERROR        0
#define  IBFEASIBLE  -1
#define  OVERFLOW    -2  
typedef  int   Status;

#define  errInt   -999
#define  MAXSTRLEN  254
                                
//typedef  unsigned char  SStr[MAXSTRLEN+1];  
typedef  unsigned char  *SStr;  

int random1i(int x) {  
   if (x<0) return 0;
   else return (int)rand() % x;
}

int random2i(int x, int y) { 
   if (x>=y) return x;
   else return (int)rand() % (y-x) + x;
}

SStr SStrFree(SStr S) {
   free(S);   return NULL;
}

SStr allocSStr(int len) {  
   SStr S;
   if (len>MAXSTRLEN) len = MAXSTRLEN;   
   if (!(S = (SStr)calloc(len+2, sizeof(char)))) exit(OVERFLOW);
   S[0] = len;   
   return S;
}

SStr SStrNew(char *cs) {  
   int cslen;   char *c;
   for (cslen=0, c=cs; *c++; ++cslen);         
   SStr S = allocSStr(cslen);                  
   memcpy(S+1, cs, (int)S[0]);                 
   S[1+S[0]] = '\0';   return S;               
}

SStr SStrAssign(SStr S, int pos, char *cs) {
   
   int len, newlen, oldlen;   char *c;
   if (!S || pos<1 || pos>1+S[0]) return S;    
   for (len=0, c=cs; *c++; ++len);             
   if (0==len) return S;                       
   if ((newlen = pos+len-1) > S[0]) {          
      if (newlen>MAXSTRLEN) newlen = MAXSTRLEN;    
      S[0] = newlen;    len = newlen - pos +1;      
      if (!(S = (SStr)realloc(S, (newlen+2)*sizeof(char)))) exit(OVERFLOW); 
      S[newlen+1] = '\0';                    
   } 
   memcpy(S+pos, cs, len);                  
   return S;                                  
} 

SStr SStrCopy(SStr S) {       
   if (!S) return NULL;       
   SStr T;
   if (!(T = (SStr)malloc((2+S[0])*sizeof(char)))) exit(OVERFLOW);
      
      memcpy(T, S, 2+S[0]);                     
   return T;
}

SStr SStrCreateRandomSStr(int length) {
   SStr S;
   int len = random2i(length/2, length);
   if (!(S = (SStr)malloc((len+2)*sizeof(char)))) exit(OVERFLOW);
   S[0] = len;
   for (int i=1; i<=len; i++) S[i] = 'A'+random1i(26); 
   S[len+1] = '\0';   return S;         
}     

int SStrLen(SStr S) {
   if (S) return S[0]; 
   else return 0;        
}   

int SStrCmp1(SStr S, SStr T) {
   if (!S || !T) return errInt;                 
   for (int i=1; i<=S[0]; i++)                  
      if (S[i] != T[i]) return (int)S[i]-T[i];
   return 0;
}

int SStrCmp(SStr S, SStr T) {  
   if (!S || !T) return errInt;                
   for (S++, T++; *S && *S == *T; S++, T++);   
   return (int)*S-*T;                          
}      


SStr SStrConcat(SStr S1, SStr S2) {  
   
   SStr T;  int i;
   if (!S1 || !S2) return  NULL; 
   if (S1[0]+S2[0] <= MAXSTRLEN) {                    
      T = allocSStr(S1[0]+S2[0]);                      
      //for (i=1; i<=S1[0]; i++) T[i] = S1[i];          
      memmove(T+1, S1+1, (int)S1[0]);                  
      //for (i=1; i<=S2[0]; i++) T[i+S1[0]] = S2[i];    
      memmove(T+(int)S1[0]+1, S2+1, (int)S2[0]);        
      T[0] = S1[0]+S2[0];
   } else if (S1[0] < MAXSTRLEN) {                    
      T = allocSStr(MAXSTRLEN);
      //for (i=1; i<=S1[0]; i++) T[i] = S1[i];
      memmove(T+1, S1+1, (int)S1[0]);             
      //for (i=S1[0]+1; i<=MAXSTRLEN; i++) T[i] = S2[i-S1[0]];
      memmove(T+(int)S1[0]+1, S2+1, MAXSTRLEN-S1[0]);             
      T[0] = MAXSTRLEN;
   } else {                                           
      T = allocSStr(MAXSTRLEN);
      //for (i=0; i<=MAXSTRLEN; i++) T[i] = S1[i];
      memmove(T, S1, (int)S1[0]+1);             
   }
   T[T[0]+1] = '\0';   return T;
} 

SStr SStrSub(SStr S, int pos, int len) { 
   
   
   if (!S || pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1)
      return NULL; //ERROR;
   SStr Sub = allocSStr(len);
   //for (int i=1; i<=len; i++) Sub[i] = S[pos+i-1];
   memcpy(Sub+1, S+pos, len);             
   Sub[0] = len;   Sub[len+1] = '\0';
   return Sub;
}
Status SStrRange(SStr S, int a, int b) { 
   if (!S || a<1 || a>b || b>S[0]) return ERROR;  
   S[0] = b-a+1;                                  
   memcpy(S+1, S+a, (int)S[0]);                
   S[1+S[0]] = '\0';                            
   return OK;
}

int Index(SStr S, SStr T, int pos) {  
    
    int i = pos, j = 1;
    while (i <= S[0] && j <= T[0])
        if (S[i] == T[j]) { ++i;   ++j; }  
        else { i = i-j+2;   j = 1; }       
    if (j > T[0]) return  i-T[0];
    else return 0;
}

持之苟有恒,久久自芬芳