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

typedef struct {
   char *sv;      
   int   len;     
   int   size;    
} *LStr;          

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;      
}

void get_anystr( int x, int y, char* str ) { 
    int i, len;
    char ch; 
    bool find;
    len = random2i(x, y);
    str[0] = 'A' + random1i(26);
    for (i=1; i<len; i++) {
       do {
          find = false;
          ch = 'A' + random1i(26);
          for (int j=0;  j<i && !find; j++)
             if (ch == str[j])
                find = true;
       } while (find);
       str[i] = ch;
    }
    str[len] = '\0';
}

void get_anystr_lc( int x, int y, char* str ) { 
    int i, len;
    char ch; 
    bool find;
    len = random2i(x, y);
    str[0] = 'a' + random1i(26);
    for (i=1; i<len; i++) {
       do {
          find = false;
          ch = 'a' + random1i(26);
          for (int j=0;  j<i && !find; j++)
             if (ch == str[j])
                find = true;
       } while (find);
       str[i] = ch;
    }
    str[len] = '\0';
}

LStr LStrFree(LStr S) {
   if (S) { free(S->sv);   free(S); }  
   return NULL;
}

LStr allocLStr(int size) {
   LStr S;
   if (!(S = (LStr)malloc((size+1)*sizeof(*S)))) exit(OVERFLOW);
   return S;
}

LStr LStrNew(char *cs) {  
   LStr S;   int len;   char *c;
   for (len=0, c=cs; *c++; ++len);  
   if (!(S = (LStr)malloc(sizeof(*S)))) exit(OVERFLOW); 
   if (0==len) { S->sv = NULL;   S->len = 0;   return S; }   
   if (!(S->sv = (char*)malloc((len+1)*sizeof(char)))) exit(OVERFLOW); 
   //for(i=0; j<len; i++) S->sv[i] = chars[i];
   memmove(S->sv, cs, len);                         
   S->len = S->size = len;   S->sv[len] = '\0';     
   return S;                                        
}
     
LStr LStrCreateRandom(int len, int c_l) {
   LStr S;
   if (!(S = (LStr)malloc(sizeof(*S)))) exit(OVERFLOW);  
   int n = (unsigned char)random2i(len/2, len);
   if (!(S->sv = (char*)malloc((n+1)*sizeof(char)))) exit(OVERFLOW);
   S->len = n;
   for (int i=0; i<n; i++)             
      S->sv[i] = c_l ? 'A'+random1i(26) : 'a'+random1i(26); 
   S->sv[n] = '\0';                    
   return S;
}

LStr LStrCopy(LStr S) {  
   if (!S) return NULL;       
   LStr T;
   if (!(T = (LStr)malloc(sizeof(*T)))) exit(OVERFLOW); 
   if (S->sv==NULL) { T->sv = NULL;   T->len = 0; }  
   else {                                               
      if (!(T->sv = (char*)malloc((S->len+1)*sizeof(char)))) exit(OVERFLOW);
      //for(int i=0; i<=S->len; i++) T->sv[i] = S->sv[i]; 
      memmove(T->sv, S->sv, S->len);                 
      T->len = S->len;                              
   }
   return T;
}

int LStrLen(LStr S) {  
   if (!S) return 0;              
   return S->len; 
}

int LStrCmp(LStr S, LStr T) {  
   
   char *s, *t;
   for (s=S->sv, t=T->sv; *s == *t; s++, t++) 
      if (*s=='\0') return 0;             
   return (int)*s - *t;                        
}

Status LStrClear(LStr S) {  
   if (!S) return ERROR;
   free(S->sv);   S->sv = NULL;   S->len = 0;
   return OK;
}

LStr LStrSub(LStr S, int pos, int len) {
   
   
   if (!S || pos<1 || pos>S->len || len<1 || len>S->len-pos+1) return NULL; 
   LStr Sub;
   if (!(Sub = (LStr)malloc(sizeof(*Sub)))) exit(OVERFLOW);  
   if (!(Sub->sv = (char *)malloc((len+1)*sizeof(char)))) exit(OVERFLOW); 
   memcpy(Sub->sv, S->sv+pos-1, len);  
   // for(int i=0; i<len ; i++) Sub->sv[i] = S->sv[pos-1+i];  
   Sub->len = len;   Sub->sv[len] = '\0';                  
   return Sub;
}

LStr LStrAssign(LStr S, int pos, char *cs) {  
   int len;   char *c;
   if (!S || pos<1 || pos>S->len+1) return S;    
   for (len=0, c=cs; *c++; ++len);  
   if (0==len) return S;            
   if (S->len < pos+len-1) S->len = pos+len-1;   
   if (S->len > S->size) {                       
      if (S->size >= 1024) S->size += 1024;    
      else S->size = 2*S->len;                 
      if (!(S->sv = (char*)realloc(S->sv, (S->size+1)*sizeof(char)))) exit(OVERFLOW); 
   }   
   memcpy(S->sv+pos-1, cs, len);                        
   S->sv[S->len] = '\0';                              
   return S;                                       
}


Status LStrInsert(LStr S, int pos, char *cs) {    
   if (!S || pos < 1 || pos > S->len+1) return ERROR; 
   int len;    char* c;
   for (len=0, c=cs; *c++;  ++len);             
   if (!len ) return OK;                            
   if (S->len + len > S->size) {                  
      char *oldsv = S->sv;                          
      if (S->size >= 1024) S->size += 1024;      
      else S->size = 2*(S->len + len);        
      if (!(S->sv = (char*)malloc((S->size+1)*sizeof(char)))) exit(OVERFLOW); 
      memcpy(S->sv, oldsv, pos-1);                                  
      memcpy(S->sv+pos-1+len, oldsv+pos-1, S->len-pos+2);      
      free(oldsv);                                                     
   } else  
      memmove(S->sv+pos-1+len, S->sv+pos-1, S->len-pos+2);     
   memcpy(S->sv+pos-1, cs, len);                                   
   S->len += len;                                                      
   return OK;
}

void LStrPrintf(char *title, LStr S) {   
   printf("%s->len = %2d; ", title, S->len);
   printf("%s = \"%s\"\n", title, S->sv);
}

持之苟有恒,久久自芬芳