|
|
1.1 ! root 1: #include "sam.h" ! 2: ! 3: #define MINSIZE 16 /* minimum number of chars allocated */ ! 4: #define MAXSIZE BLOCKSIZE /* maximum number of chars for an empty string */ ! 5: ! 6: strinit(p) ! 7: String *p; ! 8: { ! 9: gcnew(p->s, MINSIZE); ! 10: p->n=0; ! 11: p->size=MINSIZE; ! 12: } ! 13: strclose(p) ! 14: String *p; ! 15: { ! 16: gcfree(p->s); ! 17: } ! 18: strzero(p) ! 19: register String *p; ! 20: { ! 21: if(p->size>MAXSIZE){ ! 22: (void)gcrealloc(p->s, (ulong)MAXSIZE); /* throw away the garbage */ ! 23: p->size=MAXSIZE; ! 24: } ! 25: p->n=0; ! 26: } ! 27: strdup(p, s) /* copies the null */ ! 28: register String *p; ! 29: register uchar *s; ! 30: { ! 31: strinsure(p, (ulong)(p->n=strlen(s)+1)); ! 32: bcopy((uchar *)s, s+p->n, p->s, 1); ! 33: } ! 34: strdupstr(p, q) /* will copy the null if there's one there */ ! 35: register String *p, *q; ! 36: { ! 37: strinsure(p, (ulong)q->n); ! 38: p->n=q->n; ! 39: bcopy(q->s, q->s+q->n, p->s, 1); ! 40: } ! 41: straddc(p, c) ! 42: register String *p; ! 43: register c; ! 44: { ! 45: strinsure(p, (ulong)p->n+1); ! 46: p->s[p->n++]=c; ! 47: } ! 48: strinsure(p, n) ! 49: register String *p; ! 50: register ulong n; ! 51: { ! 52: register i; ! 53: if(n>=32767) ! 54: error(Etoolong); ! 55: if(p->size<n){ /* p needs to grow */ ! 56: for(i=1; i<n; i<<=1) ! 57: ; ! 58: gcrenew(p->s, i); ! 59: p->size=i; ! 60: } ! 61: } ! 62: strinsert(p, q, p0) ! 63: register String *p, *q; ! 64: register Posn p0; ! 65: { ! 66: if(p0>p->n) panic("strinsert"); ! 67: strinsure(p, (ulong)(p->n+q->n)); ! 68: bcopy(p->s+p0, p->s+p->n, p->s+p0+q->n, -1); ! 69: bcopy(q->s, q->s+q->n, p->s+p0, 1); ! 70: p->n+=q->n; ! 71: } ! 72: strdelete(p, p1, p2) ! 73: register String *p; ! 74: register Posn p1, p2; ! 75: { ! 76: if(p1>p->n || p2>p->n || p1>p2) panic("strdelete"); ! 77: bcopy(p->s+p2, p->s+p->n, p->s+p1, 1); ! 78: p->n-=(p2-p1); ! 79: } ! 80: strncmp(s1, s2, n) ! 81: register uchar *s1, *s2; ! 82: register n; ! 83: { ! 84: while (--n >= 0 && *s1 == *s2++) ! 85: if (*s1++ == '\0') ! 86: return(0); ! 87: return(n<0 ? 0 : *s1 - *--s2); ! 88: } ! 89: strcmp(s1, s2) ! 90: register uchar *s1, *s2; ! 91: { ! 92: while (*s1 == *s2++) ! 93: if (*s1++=='\0') ! 94: return(0); ! 95: return(*s1 - *--s2); ! 96: } ! 97: strcpy(s1, s2) ! 98: register uchar *s1, *s2; ! 99: { ! 100: while (*s1++ = *s2++) ! 101: ; ! 102: } ! 103: strlen(s) ! 104: register uchar *s; ! 105: { ! 106: register n=0; ! 107: while(*s++) ! 108: n++; ! 109: return n; ! 110: } ! 111: String * ! 112: tempstr(s, n) ! 113: uchar *s; ! 114: { ! 115: static String p; ! 116: p.s=s; ! 117: p.n=n; ! 118: p.size=n; ! 119: return &p; ! 120: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.