|
|
1.1 root 1: /***************************************************************************
2: * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne. JOVE *
3: * is provided to you without charge, and with no warranty. You may give *
4: * away copies of JOVE, including sources, provided that this notice is *
5: * included in all the files. *
6: ***************************************************************************/
7:
8: #include "jove.h"
9: #include "ctype.h"
10: #include "termcap.h"
11: #include "disp.h"
12: #include "fp.h"
13: #include <signal.h>
14:
15: #ifdef MAC
16: # include "mac.h"
17: #else
18: # ifdef STDARGS
19: # include <stdarg.h>
20: # else
21: # include <varargs.h>
22: # endif
23: #endif
24:
25: #ifdef MSDOS
26: #include <time.h>
27: #endif
28:
29: const struct cmd *
30: FindCmd(proc)
31: register void (*proc) proto((void));
32: {
33: register const struct cmd *cp;
34:
35: for (cp = commands; cp->Name; cp++)
36: if (cp->c_proc == proc)
37: return cp;
38: return 0;
39: }
40:
41: int Interactive; /* True when we invoke with the command handler? */
42: data_obj *LastCmd;
43: char *ProcFmt = ": %f ";
44:
45: void
46: ExecCmd(cp)
47: register data_obj *cp;
48: {
49: LastCmd = cp;
50: if (cp->Type & MAJOR_MODE) {
51: SetMajor((cp->Type >> 8));
52: } else if (cp->Type & MINOR_MODE) {
53: TogMinor((cp->Type >> 8));
54: } else switch (cp->Type&TYPEMASK) {
55: case MACRO:
56: do_macro((struct macro *) cp);
57: break;
58:
59: case FUNCTION:
60: {
61: register struct cmd *cmd = (struct cmd *) cp;
62:
63: if (cmd->c_proc) {
64: if ((cmd->Type & MODIFIER) &&
65: (BufMinorMode(curbuf, ReadOnly))) {
66: rbell();
67: message("[Buffer is read-only]");
68: } else
69: (*cmd->c_proc)();
70: }
71: }
72: }
73: }
74:
75: Line *
76: lastline(lp)
77: register Line *lp;
78: {
79: register Line *next;
80:
81: while ((next = lp->l_next) != NULL)
82: lp = next;
83: return lp;
84: }
85:
86: char key_strokes[100],
87: *keys_p = key_strokes;
88:
89: void
90: pp_key_strokes(buffer, size)
91: char *buffer;
92: size_t size;
93: {
94: char *buf_end = buffer + size - 5, /* leave some extra space */
95: *kp = key_strokes,
96: c;
97:
98: *buffer = '\0';
99: while ((c = *kp++) != '\0') {
100: swritef(buffer, "%p ", c);
101: buffer += strlen(buffer);
102: if (buffer > buf_end)
103: break;
104: }
105: }
106:
107: private int *slowp = 0; /* for waitchar() */
108:
109: private SIGRESULT
110: slowpoke(junk)
111: int junk;
112: {
113: char buffer[100];
114:
115: if (slowp)
116: *slowp = YES;
117: pp_key_strokes(buffer, sizeof (buffer));
118: f_mess(buffer);
119: SIGRETURN;
120: }
121:
122: #ifdef UNIX
123: # ifdef BSD4_2
124: # define N_SEC 1 /* will be precisely 1 second on 4.2 */
125: # else
126: # define N_SEC 2 /* but from 1 to 2 seconds otherwise */
127: # endif
128: #else /* MSDOS or MAC */
129: # define N_SEC 1
130: int in_macro();
131: #endif /* UNIX */
132:
133: int
134: waitchar(slow)
135: int *slow;
136: {
137: int c;
138: #ifdef UNIX
139: unsigned int old_time;
140: SIGRESULT (*oldproc) proto((int));
141: #else /* MSDOS or MAC */
142: long sw, time();
143: #endif /* UNIX */
144:
145: slowp = slow;
146:
147: if (in_macro()) /* make macros faster ... */
148: return getch();
149:
150: /* If slow is a valid pointer and it's value is yes, then
151: we know we have already been slow during this sequence,
152: so we just wait for the character and then echo it. */
153: if (slow != 0 && *slow == YES) {
154: c = getch();
155: slowpoke(0);
156: return c;
157: }
158: #ifdef UNIX
159: oldproc = signal(SIGALRM, slowpoke);
160:
161: if ((old_time = alarm((unsigned) N_SEC)) == 0)
162: old_time = UpdFreq;
163: c = getch();
164: (void) alarm(old_time);
165: (void) signal(SIGALRM, oldproc);
166:
167: if (slow != 0 && *slow == YES)
168: slowpoke(0);
169: return c;
170:
171: #else /* MSDOS or MAC */
172: #ifdef MAC
173: Keyonly = 1;
174: if (charp() || in_macro()) {
175: c = getch(); /* to avoid flicker */
176: if (slow != 0 && *slow == YES)
177: slowpoke();
178: return c;
179: }
180: #endif
181: time(&sw);
182: sw += N_SEC;
183: while (time(NULL) <= sw)
184: if (charp() || in_macro())
185: return getch();
186: #ifdef MAC
187: menus_off();
188: #endif
189: slowpoke();
190: c = getch();
191: slowpoke();
192:
193: return c;
194: #endif /* UNIX */
195: }
196:
197: /* dir > 0 means forward; else means backward. */
198:
199: char *
200: StrIndex(dir, buf, charpos, what)
201: int dir;
202: register char *buf;
203: int charpos;
204: register int what;
205: {
206: register char *cp = &buf[charpos];
207: register int c;
208:
209: if (dir > 0) {
210: while ((c = *cp++) != '\0')
211: if ((c == what) != '\0')
212: return (cp - 1);
213: } else {
214: while (cp >= buf && (c = *cp--)!='\0')
215: if (c == what)
216: return (cp + 1);
217: }
218: return 0;
219: }
220:
221: int
222: blnkp(buf)
223: register char *buf;
224: {
225: register char c;
226:
227: while ((c = *buf++)!='\0' && (c == ' ' || c == '\t'))
228: ;
229: return c == 0; /* It's zero if we got to the end of the Line */
230: }
231:
232: int
233: within_indent()
234: {
235: register char c;
236: register int i;
237:
238: i = curchar;
239: while (--i >= 0 && ((c = linebuf[i]) == ' ' || c == '\t'))
240: ;
241: return (i < 0); /* it's < 0 if we got to the beginning */
242: }
243:
244: Line *
245: next_line(line, num)
246: register Line *line;
247: register int num;
248: {
249: if (num < 0)
250: return prev_line(line, -num);
251: if (line)
252: while (--num >= 0 && line->l_next != 0)
253: line = line->l_next;
254: return line;
255: }
256:
257: Line *
258: prev_line(line, num)
259: register Line *line;
260: register int num;
261: {
262: if (num < 0)
263: return next_line(line, -num);
264: if (line)
265: while (--num >= 0 && line->l_prev != 0)
266: line = line->l_prev;
267: return line;
268: }
269:
270: void
271: DotTo(line, col)
272: Line *line;
273: int col;
274: {
275: Bufpos bp;
276:
277: bp.p_line = line;
278: bp.p_char = col;
279: SetDot(&bp);
280: }
281:
282: /* If bp->p_line is != current line, then save current line. Then set dot
283: to bp->p_line, and if they weren't equal get that line into linebuf. */
284:
285: void
286: SetDot(bp)
287: register Bufpos *bp;
288: {
289: register int notequal;
290:
291: if (bp == 0)
292: return;
293:
294: notequal = bp->p_line != curline;
295: if (notequal)
296: lsave();
297: if (bp->p_line)
298: curline = bp->p_line;
299: if (notequal)
300: getDOT();
301: curchar = bp->p_char;
302: if (curchar > length(curline))
303: curchar = length(curline);
304: }
305:
306: void
307: ToLast()
308: {
309: SetLine(curbuf->b_last);
310: Eol();
311: }
312:
313: int MarkThresh = 22; /* average screen size ... */
314: static int line_diff;
315:
316: int
317: LineDist(nextp, endp)
318: register Line *nextp,
319: *endp;
320: {
321: (void) inorder(nextp, 0, endp, 0);
322: return line_diff;
323: }
324:
325: int
326: inorder(nextp, char1, endp, char2)
327: register Line *nextp,
328: *endp;
329: int char1,
330: char2;
331: {
332: int count = 0;
333: register Line *prevp = nextp;
334:
335: line_diff = 0;
336: if (nextp == endp)
337: return char1 < char2;
338:
339: while (nextp || prevp) {
340: if (nextp == endp || prevp == endp)
341: break;
342: if (nextp)
343: nextp = nextp->l_next;
344: if (prevp)
345: prevp = prevp->l_prev;
346: count += 1;
347: }
348: if (nextp == 0 && prevp == 0)
349: return -1;
350: line_diff = count;
351:
352: return nextp == endp;
353: }
354:
355: void
356: PushPntp(line)
357: register Line *line;
358: {
359: if (LineDist(curline, line) >= MarkThresh)
360: set_mark();
361: }
362:
363: void
364: ToFirst()
365: {
366: SetLine(curbuf->b_first);
367: }
368:
369: int
370: length(line)
371: Line *line;
372: {
373: return strlen(lcontents(line));
374: }
375:
376: void
377: to_word(dir)
378: register int dir;
379: {
380: register char c;
381:
382: if (dir == FORWARD) {
383: while ((c = linebuf[curchar]) != 0 && !isword(c))
384: curchar += 1;
385: if (eolp()) {
386: if (curline->l_next == 0)
387: return;
388: SetLine(curline->l_next);
389: to_word(dir);
390: return;
391: }
392: } else {
393: while (!bolp() && (c = linebuf[curchar - 1], !isword(c)))
394: curchar -= 1;
395: if (bolp()) {
396: if (curline->l_prev == 0)
397: return;
398: SetLine(curline->l_prev);
399: Eol();
400: to_word(dir);
401: }
402: }
403: }
404:
405: /* Are there any modified buffers? Allp means include B_PROCESS
406: buffers in the check. */
407:
408: int
409: ModBufs(allp)
410: int allp;
411: {
412: register Buffer *b;
413:
414: for (b = world; b != 0; b = b->b_next) {
415: if (b->b_type == B_SCRATCH)
416: continue;
417: if ((b->b_type == B_FILE || allp) && IsModified(b))
418: return 1;
419: }
420: return 0;
421: }
422:
423: char *
424: filename(b)
425: register Buffer *b;
426: {
427: return b->b_fname ? pr_name(b->b_fname, YES) : "[No file]";
428: }
429:
430: char *
431: itoa(num)
432: register int num;
433: {
434: static char line[15];
435:
436: swritef(line, "%d", num);
437: return line;
438: }
439:
440: int
441: min(a, b)
442: register int a,
443: b;
444: {
445: return (a < b) ? a : b;
446: }
447:
448: int
449: max(a, b)
450: register int a,
451: b;
452: {
453: return (a > b) ? a : b;
454: }
455:
456: void
457: tiewind(w, bp)
458: register Window *w;
459: register Buffer *bp;
460: {
461: int not_tied = (w->w_bufp != bp);
462:
463: UpdModLine = YES; /* kludge ... but speeds things up considerably */
464: w->w_line = bp->b_dot;
465: w->w_char = bp->b_char;
466: w->w_bufp = bp;
467: if (not_tied)
468: CalcWind(w); /* ah, this has been missing since the
469: beginning of time! */
470: }
471:
472: char *
473: lcontents(line)
474: register Line *line;
475: {
476: if (line == curline)
477: return linebuf;
478: else
479: return lbptr(line);
480: }
481:
482: char *
483: ltobuf(line, buf)
484: Line *line;
485: char *buf;
486: {
487: if (line == curline) {
488: if (buf != linebuf)
489: strcpy(buf, linebuf);
490: Jr_Len = strlen(linebuf);
491: } else
492: getline(line->l_dline, buf);
493: return buf;
494: }
495:
496: void
497: DOTsave(buf)
498: Bufpos *buf;
499: {
500: buf->p_line = curline;
501: buf->p_char = curchar;
502: }
503:
504: /* Return none-zero if we had to rearrange the order. */
505:
506: int
507: fixorder(line1, char1, line2, char2)
508: register Line **line1,
509: **line2;
510: register int *char1,
511: *char2;
512: {
513: Line *tline;
514: int tchar;
515:
516: if (inorder(*line1, *char1, *line2, *char2))
517: return 0;
518:
519: tline = *line1;
520: tchar = *char1;
521: *line1 = *line2;
522: *char1 = *char2;
523: *line2 = tline;
524: *char2 = tchar;
525:
526: return 1;
527: }
528:
529: int
530: inlist(first, what)
531: register Line *first,
532: *what;
533: {
534: while (first) {
535: if (first == what)
536: return 1;
537: first = first->l_next;
538: }
539: return 0;
540: }
541:
542: /* Make `buf' (un)modified and tell the redisplay code to update the modeline
543: if it will need to be changed. */
544:
545: int ModCount = 0;
546:
547: void
548: modify()
549: {
550: if (!curbuf->b_modified) {
551: UpdModLine = YES;
552: curbuf->b_modified = YES;
553: }
554: DOLsave = YES;
555: if (!Asking)
556: ModCount += 1;
557: }
558:
559: void
560: unmodify()
561: {
562: if (curbuf->b_modified) {
563: UpdModLine = YES;
564: curbuf->b_modified = NO;
565: }
566: }
567:
568: int
569: numcomp(s1, s2)
570: register char *s1,
571: *s2;
572: {
573: register int count = 0;
574:
575: while (*s1 != 0 && *s1++ == *s2++)
576: count += 1;
577: return count;
578: }
579:
580: char *
581: copystr(str)
582: char *str;
583: {
584: char *val;
585:
586: if (str == 0)
587: return 0;
588: val = emalloc((size_t) (strlen(str) + 1));
589:
590: strcpy(val, str);
591: return val;
592: }
593:
594: #ifndef byte_copy
595: void
596: byte_copy(from, to, count)
597: register char *from,
598: *to;
599: register size_t count;
600: {
601: while (count-- > 0)
602: *to++ = *from++;
603: }
604: #endif
605:
606: void
607: len_error(flag)
608: int flag;
609: {
610: char *mesg = "[line too long]";
611:
612: if (flag == COMPLAIN)
613: complain(mesg);
614: else
615: error(mesg);
616: }
617:
618: /* Insert num number of c's at offset atchar in a linebuf of LBSIZE */
619:
620: void
621: ins_c(c, buf, atchar, num, max)
622: int c;
623: char *buf;
624: int atchar,
625: num,
626: max;
627: {
628: register char *pp, *pp1;
629: register int len;
630: int numchars; /* number of characters to copy forward */
631:
632: if (num <= 0)
633: return;
634: len = atchar + strlen(&buf[atchar]);
635: if (len + num >= max)
636: len_error(COMPLAIN);
637: pp = &buf[len + 1]; /* + 1 so we can --pp (not pp--) */
638: pp1 = &buf[len + num + 1];
639: numchars = len - atchar;
640: while (numchars-- >= 0)
641: *--pp1 = *--pp;
642: pp = &buf[atchar];
643: while (--num >= 0)
644: *pp++ = c;
645: }
646:
647: int
648: TwoBlank()
649: {
650: register Line *next = curline->l_next;
651:
652: return ((next != 0) &&
653: (*(lcontents(next)) == '\0') &&
654: (next->l_next != 0) &&
655: (*(lcontents(next->l_next)) == '\0'));
656: }
657:
658: void
659: linecopy(onto, atchar, from)
660: register char *onto,
661: *from;
662: int atchar;
663: {
664: register char *endp = &onto[LBSIZE - 2];
665:
666: onto += atchar;
667:
668: while ((*onto = *from++) != '\0')
669: if (onto++ >= endp)
670: len_error(ERROR);
671: }
672:
673: char *
674: IOerr(err, file)
675: char *err, *file;
676: {
677: return sprint("Couldn't %s \"%s\".", err, file);
678: }
679:
680: #ifdef UNIX
681: void
682: dopipe(p)
683: int *p;
684: {
685: if (pipe(p) == -1)
686: complain("[Pipe failed]");
687: }
688:
689: void
690: pclose(p)
691: int *p;
692: {
693: (void) close(p[0]);
694: (void) close(p[1]);
695: }
696: #endif /* UNIX */
697:
698: /* NOSTRICT */
699:
700: char *
701: emalloc(size)
702: size_t size;
703: {
704: register char *ptr;
705:
706: if ((ptr = malloc(size)) != NULL)
707: return ptr;
708: /* Try garbage collecting lines */
709: GCchunks();
710: if ((ptr = malloc(size)) != NULL)
711: return ptr;
712: /* Uh ... Oh screw it! */
713: error("[Out of memory] ");
714: /* NOTREACHED */
715: }
716:
717: /* Return the basename of file F. */
718:
719: char *
720: basename(f)
721: register char *f;
722: {
723: register char *cp;
724:
725: if ((cp = strrchr(f, '/')) != NULL)
726: return cp + 1;
727: else
728: #ifdef MSDOS
729: if (cp = strrchr(f, '\\'))
730: return cp + 1;
731: else
732: if (cp = strrchr(f, ':'))
733: return cp + 1;
734: #endif /* MSDOS */
735: return f;
736: }
737:
738: void
739: push_env(savejmp)
740: jmp_buf savejmp;
741: {
742: byte_copy((char *) mainjmp, (char *) savejmp, sizeof (jmp_buf));
743: }
744:
745: void
746: pop_env(savejmp)
747: jmp_buf savejmp;
748: {
749: byte_copy((char *) savejmp, (char *) mainjmp, sizeof (jmp_buf));
750: }
751:
752: #ifdef LOAD_AV
753: # if defined(BSD4_2) && !defined(BSD2_10)
754: # if defined(PURDUE_EE) && (defined(vax) || defined(gould))
755:
756: void
757: get_la(dp)
758: double *dp;
759: {
760: *dp = (double) loadav(0) / 100.0;
761: }
762:
763: # else /* !PURDUE_EE || (!vax && !gould) */
764:
765: #ifdef sun
766: # include <sys/param.h>
767: #endif
768: #include <nlist.h>
769:
770: static struct nlist nl[] = {
771: { "_avenrun" },
772: #define X_AVENRUN 0
773: { "" }
774: };
775:
776: void
777: get_la(dp)
778: double *dp;
779: {
780: #ifdef sun
781: long avenrun[3];
782: #else
783: double avenrun[3];
784: #endif
785: static int kmem = 0;
786: extern long lseek proto((int, long, int));
787:
788: if (kmem == -1) {
789: *dp = 4.0; /* So shell commands will say "Chugging" */
790: return;
791: } else if (kmem == 0) {
792: if ((kmem = open("/dev/kmem", 0)) == -1) {
793: f_mess("Can't open kmem for load average.");
794: *dp = 4.0;
795: return;
796: }
797: nlist("/vmunix", nl);
798: }
799: lseek(kmem, (long) nl[X_AVENRUN].n_value, 0);
800: read(kmem, (char *) avenrun, sizeof(avenrun));
801: #ifdef sun
802: *dp = (double) avenrun[0] / FSCALE;
803: #else
804: *dp = avenrun[0];
805: #endif
806: }
807:
808: # endif
809: # else /* !BSD4_2 || BSD2_10 */
810:
811: void
812: get_la(dp)
813: double *dp;
814: {
815: short avg[3];
816:
817: gldav(avg);
818: *dp = (double) avg[0] / 256;
819: }
820:
821: # endif
822: #endif /* LOAD_AV */
823:
824: /* get the time buf, designated by *timep, from FROM to TO. */
825: char *
826: get_time(timep, buf, from, to)
827: time_t *timep;
828: char *buf;
829: int from,
830: to;
831: {
832: time_t now;
833: char *cp;
834: extern char *ctime();
835:
836: if (timep != 0)
837: now = *timep;
838: else
839: (void) time(&now);
840: cp = ctime(&now) + from;
841: #ifndef MSDOS
842: if (to == -1)
843: #else /* MSDOS */
844: if ((to == -1) && (cp[strlen(cp)-1] == '\n'))
845: #endif /* MSDOS */
846: cp[strlen(cp) - 1] = '\0'; /* Get rid of \n */
847: else
848: cp[to - from] = '\0';
849: if (buf) {
850: strcpy(buf, cp);
851: return buf;
852: } else
853: return cp;
854: }
855:
856: int
857: casecmp(s1, s2)
858: register char *s1,
859: *s2;
860: {
861: if (!s1 || !s2)
862: return 1; /* which is not zero ... */
863: while (CharUpcase(*s1) == CharUpcase(*s2++))
864: if (*s1++ == '\0')
865: return 0;
866: return (*s1 - *--s2);
867: }
868:
869: int
870: casencmp(s1, s2, n)
871: register char *s1,
872: *s2;
873: register size_t n;
874: {
875: if (!s1 || !s2)
876: return 1; /* which is not zero ... */
877: for (;;) {
878: if (n == 0)
879: return 0;
880: n--;
881: if (CharUpcase(*s1) != CharUpcase(*s2++))
882: return *s1 - *--s2;
883: if (*s1++ == '\0')
884: return 0;
885: }
886: }
887:
888: void
889: null_ncpy(to, from, n)
890: char *to,
891: *from;
892: size_t n;
893: {
894: (void) strncpy(to, from, n);
895: to[n] = '\0';
896: }
897:
898: /* Tries to pause for delay/10 seconds OR until a character is typed
899: at the keyboard. This works well on BSD4_2 and not so well on the
900: rest. Returns 1 if it returned because of keyboard input, or 0
901: otherwise. */
902:
903: #ifdef MAC
904: void
905: SitFor(delay)
906: int delay;
907: {
908: long start,
909: end;
910:
911: #define Ticks ((long *) 0x16A) /* 1/60 sec */
912: Keyonly = 1;
913: redisplay();
914: start = *Ticks;
915:
916: end = start + delay * 6;
917: do
918: if (InputPending = charp())
919: break;
920: while (*Ticks < end);
921: #undef Ticks
922: }
923: #else /* not MAC */
924:
925: #ifndef MSDOS
926: #if defined(BSD4_2) && !defined(BSD2_10)
927: #include <sys/time.h>
928: #endif
929: #endif
930:
931: void
932: SitFor(delay)
933: int delay;
934: {
935: #ifndef MSDOS
936: #if defined(BSD4_2) && !defined(BSD2_10)
937: struct timeval timer;
938: long readfds = 1;
939:
940: timer.tv_sec = (delay / 10);
941: timer.tv_usec = (delay % 10) * 100000;
942:
943: if (charp())
944: return;
945: /* gross that I had to snarf this from getch() */
946: if (!UpdMesg && !Asking) { /* Don't erase if we are asking */
947: if (mesgbuf[0] && !errormsg)
948: message(NullStr);
949: }
950: redisplay();
951: select(1, &readfds, (long *)0, (long *)0, &timer);
952: #else
953: static const int cps[] = {
954: 0,
955: 5,
956: 7,
957: 11,
958: 13,
959: 15,
960: 20,
961: 30,
962: 60,
963: 120,
964: 180,
965: 240,
966: 480,
967: 960,
968: 1920,
969: 1920,
970: };
971: register int nchars,
972: check_cnt;
973:
974: if (charp())
975: return;
976: nchars = (delay * cps[ospeed]) / 10;
977: check_cnt = BufSize;
978: redisplay();
979: while ((--nchars > 0) && !InputPending) {
980: jputchar(0);
981: if (--check_cnt == 0) {
982: check_cnt = BufSize;
983: InputPending = charp();
984: }
985: }
986: #endif
987: #else /* MSDOS */
988: #include <bios.h>
989: #include <dos.h>
990:
991: long start,
992: end;
993: #ifndef IBMPC
994: struct dostime_t tc;
995: #endif
996:
997: redisplay();
998: #ifdef IBMPC
999: _bios_timeofday(_TIME_GETCLOCK, &start);
1000: #else
1001: _dos_gettime(&tc);
1002: start = (long)(tc.hour*60L*60L*10L)+(long)(tc.minute*60L*10L)+
1003: (long)(tc.second*10)+(long)(tc.hsecond/10);
1004: #endif
1005: end = (start + delay);
1006: do {
1007: if (InputPending = charp())
1008: break;
1009: #ifdef IBMPC
1010: if (_bios_timeofday(_TIME_GETCLOCK, &start))
1011: break; /* after midnight */
1012: #else
1013: start = (long)(tc.hour*60L*60L*10L)+(long)(tc.minute*60L*10L)+
1014: (long)(tc.second*10)+(long)(tc.hsecond/10);
1015: #endif
1016: }
1017: while (start < end);
1018: #endif /* MSDOS */
1019: }
1020: #endif /* MAC */
1021:
1022: int
1023: sindex(pattern, string)
1024: register char *pattern,
1025: *string;
1026: {
1027: register size_t len = strlen(pattern);
1028:
1029: while (*string != '\0') {
1030: if (*pattern == *string && strncmp(pattern, string, len) == 0)
1031: return TRUE;
1032: string += 1;
1033: }
1034: return FALSE;
1035: }
1036:
1037: void
1038: make_argv(argv, ap)
1039: register char *argv[];
1040: va_list ap;
1041: {
1042: register char *cp;
1043: register int i = 0;
1044:
1045: argv[i++] = va_arg(ap, char *);
1046: argv[i++] = basename(argv[0]);
1047: while ((cp = va_arg(ap, char *)) != NULL)
1048: argv[i++] = cp;
1049: argv[i] = 0;
1050: }
1051:
1052: int
1053: pnt_line()
1054: {
1055: register Line *lp = curbuf->b_first;
1056: register int i;
1057:
1058: for (i = 0; lp != 0; i++, lp = lp->l_next)
1059: if (lp == curline)
1060: break;
1061: return i + 1;
1062: }
1063:
1064: char *
1065: ralloc(obj, size)
1066: register char *obj;
1067: size_t size;
1068: {
1069: register char *new;
1070:
1071: if (obj)
1072: new = realloc(obj, size);
1073: if (new == 0 || !obj)
1074: new = emalloc(size);
1075: return new;
1076: }
1077:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.