// abcdefg.c // // This file provides basic query functions for characters and null-terminated strings. // // by John D. de Boer #include "abcdefg.h" // String length functions long length(const char *S) { char *L; if (!S) return 0; L=(char *)S; while (*L) L++; return L - S; } bool linebreak(char C) { return C=='\n' || C=='\r'; } long linelength(const char *S) { char *P; P=(char *)S; if (!P) return 0; while (*P && !linebreak(*P)) P++; return P - S; } // String search functions char *firstocc(char C, const char *S) { if (!S) return NULL; while (*S) { if (*S==C) return (char *)S; S++; } return NULL; } char *firstoccoflist(const char *C, const char *S) { if (!C || !S) return NULL; while (*S) { if (firstocc(*S,C)) return (char *)S; S++; } return NULL; } char *lastocc(char C, const char *S) { char *L; if (!S) return NULL; L=NULL; while (*S) { if (*S==C) L=(char *)S; S++; } return L; } // Character query functions bool lowercase(char C) { return C>='a' && C<='z'; } bool uppercase(char C) { return C>='A' && C<='Z'; } bool letter(char C) { return lowercase(C) || uppercase(C); } bool numeral(char C) { return C>='0' && C<='9'; } bool punctuation(char C) { return firstocc(C,".,?!:;-'\"")!=NULL; } bool quotechar(char C) { return C=='\'' || C=='"'; } bool vowel(char C) { return firstocc(C,"aeiouAEIOU")!=NULL; } bool wordbreak(char C) { return firstocc(C," .,?!:;-'\"@\t\r()[]")!=NULL; } // String query functions static char nocaps(char C) { return uppercase(C) ? (C - 'A' + 'a') : C; } bool punctuated(const char *S) { if (!S || !*S) return 0; while (*S) S++; S--; return punctuation(*S); } bool streq(const char *A, const char *B) { if (A && !*A) A=NULL; if (B && !*B) B=NULL; if (!A && !B) return 1; if (!A || !B) return 0; while (*A) if (*(B++)!=*(A++)) return 0; return (!*B); } bool streqci(const char *A, const char *B) { char C,D; if (A && !*A) A=NULL; if (B && !*B) B=NULL; if (!A && !B) return 1; if (!A || !B) return 0; while (*A) { C=nocaps(*(A++)); D=nocaps(*(B++)); if (C!=D) return 0; } return (!*B); } bool abbrev(const char *S, int N, const char *Full, int MIN) { int i; if (!S || !Full || Nlength(Full)) return 0; for (i=0;iBE) if (*(--S)!=*(--E)) return 0; return 1; } bool endword(const char *S, const char *E) { char *BS,*BE; if (!S || !E) return 0; BS=(char *)S; BE=(char *)E; while (*S) S++; while (*E) E++; if (S - BS < E - BE) return 0; while (E>BE) if (*(--S)!=*(--E)) return 0; return S==BS || *(--S)==' '; } bool wordin(const char *A, const char *B, bool Case) { char *C; char E,F; if (!A || !*A || !B || !*B) return 0; while (1) { while (*B && wordbreak(*B)) B++; if (!*B) return 0; C=(char *)A; while (C && *C && !wordbreak(*B) && *C!='*') { E=*(B++); F=*(C++); if (!Case) { E=nocaps(E); F=nocaps(F); } if (E!=F) C=NULL; } if (C) { if (!*C && (!*B || wordbreak(*B))) return 1; if (*C=='*' && *B && !wordbreak(*B)) return 1; } while (*B && !wordbreak(*B)) B++; if (!*B) return 0; } } int alphabetical(const char *A, const char *B) { char C,D; if (!A && !B) return 0; if (!A) return 1; if (!B) return -1; while (1) { C=*(A++); if (!C) break; C=nocaps(C); D=nocaps(*(B++)); if (CD) return -1; } if (*B) return 1; return 0; } char *position(const char *A, const char *B) { if (!A || !*A || !B || !*B) return NULL; while (1) { B=firstocc(*A,B); if (!B) return NULL; if (begins(B,A)) return (char *)B; B++; } return NULL; } char *lastchar(const char *S) { if (!S || !*S) return NULL; while (*S) S++; return (char *)(S - 1); } char *charafter(const char *A, const char *B) { char *P; if (!A || !*A || !B || !*B) return NULL; P=position(A,B); if (!P) return NULL; P+=length(A); if (!*P) return NULL; while (*P==' ' || linebreak(*P)) P++; if (!*P) return NULL; return P; }