1 /* $Id: s.c 441 2005-01-05 09:46:25Z dvd $ */
2 
3 #include <string.h> /*strcpy,strlen*/
4 #include <assert.h>
5 #include "xmlc.h"
6 #include "m.h"
7 #include "s.h"
8 
s_cmpn(char * s1,char * s2,int n2)9 int s_cmpn(char *s1,char *s2,int n2) {
10   char *end=s2+n2;
11   for(;;++s1,++s2) {
12     if(s2==end) return *s1;
13     if(*s1=='\0') return -*s2;
14     if(*s1!=*s2) return *s1-*s2;
15   }
16 }
17 
s_tokcmpn(char * s1,char * s2,int n2)18 int s_tokcmpn(char *s1,char *s2,int n2) {
19   char *end2=s2+n2;
20  /* all white space characters are one byte long */
21   while(xmlc_white_space(*s1)) ++s1;
22   while(s2!=end2&&xmlc_white_space(*s2)) ++s2;
23   for(;;) {
24     if(s2==end2) {
25       while(xmlc_white_space(*s1)) ++s1;
26       return *s1;
27     }
28     if(*s1=='\0') {
29       while(s2!=end2&&xmlc_white_space(*s2)) ++s2;
30       return s2==end2?0:-*s2;
31     }
32     if(xmlc_white_space(*s1)&&xmlc_white_space(*s2)) {
33       do ++s1; while(xmlc_white_space(*s1));
34       do ++s2; while(s2!=end2&&xmlc_white_space(*s2));
35     } else {
36       if(*s1!=*s2) return *s1-*s2;
37       ++s1; ++s2;
38     }
39   }
40 }
41 
s_hval(char * s)42 int s_hval(char *s) {
43   int h=0;
44   while(*s) h=h*31+*(s++);
45   return h;
46 }
47 
s_clone(char * s)48 char *s_clone(char *s) {
49   return strcpy((char*)m_alloc(strlen(s)+1,sizeof(char)),s);
50 }
51 
s_abspath(char * r,char * b)52 char *s_abspath(char *r,char *b) {
53   if(*r!='/') {
54     char *c=b,*sep=(char*)0;
55     for(;;) {if(!(*c)) break; if(*c++=='/') sep=c;}
56     if(sep) {
57       char *p=r,*q;
58       while(*p++); q=p+(sep-b);
59       do *(--q)=*(--p); while(p!=r);
60       while(b!=sep) *r++=*b++;
61     }
62   }
63   return r;
64 }
65 
s_tab(char * s,char * tab[],int size)66 int s_tab(char *s,char *tab[],int size) {return s_ntab(s,strlen(s),tab,size);}
s_ntab(char * s,int len,char * tab[],int size)67 int s_ntab(char *s,int len,char *tab[],int size) {
68   int n=0,m=size-1,i,cmp;
69   for(;;) {
70     if(n>m) return size;
71     i=(n+m)/2;
72     if((cmp=s_cmpn(tab[i],s,len))==0) return i; else {if(cmp>0) m=i-1; else n=i+1;}
73   }
74 }
75 
s_test()76 void s_test() {
77   assert(s_cmpn("","",0)==0);
78   assert(s_cmpn("/xyz","/xyz",4)==0);
79   assert(s_cmpn("xyz","yz",2)<0);
80   assert(s_cmpn("xyz","xxyz",4)>0);
81 
82   { char r[256];
83     s_abspath(strcpy(r,"/x"),"/y");
84     assert(strcmp(r,"/x")==0);
85     s_abspath(strcpy(r,"x"),"/y");
86     assert(strcmp(r,"/x")==0);
87     s_abspath(strcpy(r,"x"),"/y/");
88     assert(strcmp(r,"/y/x")==0);
89     s_abspath(strcpy(r,"x"),"y/");
90     assert(strcmp(r,"y/x")==0);
91     s_abspath(strcpy(r,"x"),"y");
92     assert(strcmp(r,"x")==0);
93     s_abspath(strcpy(r,""),"y");
94     assert(strcmp(r,"")==0);
95   }
96 
97   assert(s_tokcmpn("","",0)==0);
98   assert(s_tokcmpn(""," ",1)==0);
99   assert(s_tokcmpn("A","A",1)==0);
100   assert(s_tokcmpn(" A   B","A B  ",5)==0);
101   assert(s_tokcmpn("AB","A B",3)>0);
102   assert(s_tokcmpn("","A",1)<0);
103 }
104