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