|
|
1.1 root 1: #include <jerq.h>
2: #include "frame.h"
3:
4: #define MAXROOM 1024 /* maximum extra number of chars after insure() */
5:
6: char *
7: GCalloc(n, p)
8: int n;
9: char **p;
10: {
11: gcalloc((unsigned long)n, p);
12: }
13:
14: insure(p, n)
15: register String *p;
16: register short n;
17: {
18: register i;
19: char *old;
20: if (p->size < n) { /* p needs to grow */
21: for (i = 1; i < n; i <<= 1)
22: ;
23: if(i > n+MAXROOM)
24: i = n+MAXROOM;
25: if(p->s==0)
26: old=0;
27: else{
28: GCalloc(p->n, &old);
29: movstring(p->n, p->s, old);
30: gcfree(p->s);
31: }
32: GCalloc(i, &p->s);
33: if(old){
34: movstring(p->n, old, p->s);
35: gcfree(old);
36: }
37: p->size = i;
38: }
39: }
40: #define MINCHARS 64 /* for efficiency; min size of a string we'll alloc */
41: strzero(p)
42: String *p;
43: {
44: if(p->s && p->size>MINCHARS){
45: p->n=0;
46: p->size=0; /* forces strinsure to free the old stuff */
47: }
48: insure(p, MINCHARS);
49: p->n = 0;
50: }
51: insstring(p, i, q)
52: register String *p, *q;
53: register short i;
54: {
55: insure(p, p->n+q->n);
56: movstring(i-p->n, p->s+p->n, p->s+p->n+q->n);
57: movstring(q->n, q->s, p->s+i);
58: p->n += q->n;
59: }
60: delstring(p, i, j)
61: register String *p;
62: register short i, j;
63: {
64: register n = j-i;
65: movstring(p->n-j, p->s+j, p->s+i);
66: p->n -= n;
67: }
68: movstring(i, s, d)
69: register short i;
70: register char *s, *d;
71: {
72: if (i > 0)
73: do
74: *d++ = *s++;
75: while (--i > 0);
76: else {
77: if (i++ < 0) /* transfer -i chars in loop */
78: do
79: *--d = *--s;
80: while (i++ < 0);
81: }
82: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.