Annotation of 43BSDTahoe/new/jove/util.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.