Annotation of 43BSDReno/contrib/isode-beta/others/quipu/uips/fred/dispatch.c, revision 1.1

1.1     ! root        1: /* dispatch.c - fred dispatch */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/others/quipu/uips/fred/RCS/dispatch.c,v 7.9 90/07/27 08:45:18 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/others/quipu/uips/fred/RCS/dispatch.c,v 7.9 90/07/27 08:45:18 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       dispatch.c,v $
        !            12:  * Revision 7.9  90/07/27  08:45:18  mrose
        !            13:  * update
        !            14:  * 
        !            15:  * Revision 7.8  90/06/11  10:55:01  mrose
        !            16:  * UFN
        !            17:  * 
        !            18:  * Revision 7.7  90/03/22  16:10:42  mrose
        !            19:  * xwp
        !            20:  * 
        !            21:  * Revision 7.6  90/03/22  08:36:29  mrose
        !            22:  * touch-up
        !            23:  * 
        !            24:  * Revision 7.5  90/03/08  08:05:00  mrose
        !            25:  * phone
        !            26:  * 
        !            27:  * Revision 7.4  90/01/16  20:43:19  mrose
        !            28:  * last check-out
        !            29:  * 
        !            30:  * Revision 7.3  90/01/11  18:36:21  mrose
        !            31:  * real-sync
        !            32:  * 
        !            33:  * Revision 7.2  89/12/14  18:48:56  mrose
        !            34:  * KIS project
        !            35:  * 
        !            36:  * Revision 7.1  89/12/13  20:01:43  mrose
        !            37:  * errfp
        !            38:  * 
        !            39:  * Revision 7.0  89/11/23  22:08:52  mrose
        !            40:  * Release 6.0
        !            41:  * 
        !            42:  */
        !            43: 
        !            44: /*
        !            45:  *                               NOTICE
        !            46:  *
        !            47:  *    Acquisition, use, and distribution of this module and related
        !            48:  *    materials are subject to the restrictions of a license agreement.
        !            49:  *    Consult the Preface in the User's Manual for the full terms of
        !            50:  *    this agreement.
        !            51:  *
        !            52:  */
        !            53: 
        !            54: 
        !            55: #include <ctype.h>
        !            56: #include "fred.h"
        !            57: #ifdef BSD42
        !            58: #include <sys/ioctl.h>
        !            59: #endif
        !            60: #include <sys/stat.h>
        !            61: 
        !            62: /*    DATA */
        !            63: 
        !            64: int    debug = 0;
        !            65: int    fflag = 0;
        !            66: int    kflag = 0;
        !            67: int    mail = 0;
        !            68: int    nametype = 1;
        !            69: int    network = 0;
        !            70: int    phone = 0;
        !            71: int    query = 1;
        !            72: int    readonly = 0;
        !            73: int    soundex = 0;
        !            74: int    timelimit = 300;
        !            75: int    verbose = 0;
        !            76: int    watch = 0;
        !            77: 
        !            78: int    usetty = 1;
        !            79: int    ifd = NOTOK;
        !            80: int    ofd = NOTOK;
        !            81: 
        !            82: int    rcmode = 00;
        !            83: int    runcom = 0;
        !            84: int    runsys = 0;
        !            85: 
        !            86: char   *manager = "internal";
        !            87: char   *pager = "more";
        !            88: 
        !            89: char   *mydn = NULLCP;
        !            90: char   *myhome = NULLCP;
        !            91: char   *myuser = NULLCP;
        !            92: 
        !            93: 
        !            94: FILE   *stdfp = stdout;
        !            95: FILE   *errfp = NULL;
        !            96: 
        !            97: /*  */
        !            98: 
        !            99: int    f_set (), f_help ();
        !           100: int    f_alias (), f_area (), f_dish (), f_edit (), f_manual (), f_report (),
        !           101:        f_thisis ();
        !           102: int    f_bind (), f_quit ();
        !           103: int    f_whois ();
        !           104: 
        !           105: 
        !           106: static struct dispatch dispatches[] = {
        !           107:     "alias", f_alias, DS_SYOK,
        !           108:     "report on active aliases",
        !           109: 
        !           110:     "area", f_area, DS_NULL,
        !           111:     "set default area for searches",
        !           112: 
        !           113:     "dish", f_dish, DS_USER,
        !           114:     "talk directly to dish (experts only!)",
        !           115:     
        !           116:     "edit", f_edit, DS_USER,
        !           117:     "edit entry in the white pages",
        !           118:     
        !           119:     "help", f_help, DS_NULL,
        !           120:     "print help information",
        !           121: 
        !           122:     "manual", f_manual, DS_NULL,
        !           123:     "print detailed documentation",
        !           124: 
        !           125:     "quit", f_quit, DS_USER,
        !           126:     "terminate fred",
        !           127: 
        !           128:     "report", f_report, DS_USER,
        !           129:     "send report to white pages manager",
        !           130: 
        !           131:     "set", f_set, DS_SYOK,
        !           132:     "display or change variables",
        !           133: 
        !           134:     "thisis", f_thisis, DS_USER,
        !           135:     "identify self to the white pages",
        !           136: 
        !           137:     "whois", f_whois, DS_NULL,
        !           138:     "find something in the white pages",
        !           139: 
        !           140:     NULL
        !           141: };
        !           142: 
        !           143: struct dispatch *getds ();
        !           144: 
        !           145: /*    DISPATCH */
        !           146: 
        !           147: fredloop (vec, error)
        !           148: char  **vec;
        !           149: int    error;
        !           150: {
        !           151:     register struct dispatch *ds;
        !           152: 
        !           153:     if ((ds = getds (strcmp (*vec, "?") ? *vec : "help")) == NULL)
        !           154:        return error;
        !           155:     if (network) {
        !           156:        if ((ds -> ds_flags & DS_USER)
        !           157:                || ((ds -> ds_flags & DS_SYOK) && !runsys)) {
        !           158:            advise (NULLCP, "unavailable operation \"%s\"", *vec);
        !           159:            return error;
        !           160:        }
        !           161:     }
        !           162:     else
        !           163:        vec[0] = ds -> ds_name;
        !           164: 
        !           165:     switch ((*ds -> ds_fnx) (vec)) {
        !           166:        case NOTOK:
        !           167:            return error;
        !           168: 
        !           169:        case OK:
        !           170:        default:
        !           171:            return OK;
        !           172: 
        !           173:         case DONE:
        !           174:            return DONE;
        !           175:     }
        !           176: }
        !           177: 
        !           178: /*  */
        !           179: 
        !           180: static struct dispatch *getds (name)
        !           181: char   *name;
        !           182: {
        !           183:     register int    longest,
        !           184:                     nmatches;
        !           185:     register char  *p,
        !           186:                    *q;
        !           187:     char    buffer[BUFSIZ];
        !           188:     register struct dispatch   *ds,
        !           189:                                *fs;
        !           190: 
        !           191:     longest = nmatches = 0;
        !           192:     for (ds = dispatches; p = ds -> ds_name; ds++) {
        !           193:        for (q = name; *q == *p++; q++)
        !           194:            if (*q == NULL)
        !           195:                return ds;
        !           196: 
        !           197:        if (*q == NULL)
        !           198:            if (q - name > longest) {
        !           199:                longest = q - name;
        !           200:                nmatches = 1;
        !           201:                fs = ds;
        !           202:            }
        !           203:            else
        !           204:                if (q - name == longest)
        !           205:                    nmatches++;
        !           206:     }
        !           207: 
        !           208:     switch (nmatches) {
        !           209:        case 0: 
        !           210:            if (*(p = name) == '!')
        !           211:                p++;
        !           212:            for (; *p; p++)
        !           213:                if (!isdigit (*p))
        !           214:                    break;
        !           215:            if (!*p || network)
        !           216:                for (ds = dispatches; ds -> ds_name; ds++)
        !           217:                    if (strcmp (ds -> ds_name, "whois") == 0)
        !           218:                        return ds;
        !           219: 
        !           220:            advise (NULLCP, "unknown operation \"%s\"", name);
        !           221:            return NULL;
        !           222: 
        !           223:        case 1: 
        !           224:            return fs;
        !           225: 
        !           226:        default: 
        !           227:            for (ds = dispatches, p = buffer; q = ds -> ds_name; ds++)
        !           228:                if (strncmp (q, name, longest) == 0) {
        !           229:                    (void) sprintf (p, "%s \"%s\"", p != buffer ? "," : "", q);
        !           230:                    p += strlen (p);
        !           231:                }
        !           232:            advise (NULLCP, "ambiguous operation, it could be one of:%s",
        !           233:                        buffer);
        !           234:            return NULL;
        !           235:     }
        !           236: }
        !           237: 
        !           238: /*    VARIABLES */
        !           239: 
        !           240: static char *bool[] = {
        !           241:     "off", "on", NULL
        !           242: };
        !           243: 
        !           244: static char *names[] = {
        !           245:     "fullname", "surname", "friendly", NULL
        !           246: };
        !           247: 
        !           248: 
        !           249: struct var {
        !           250:     char   *v_name;
        !           251:     IP     v_value;
        !           252: 
        !           253:     char   *v_dname;
        !           254:     char  **v_dvalue;
        !           255:     char   *v_mask;
        !           256: 
        !           257:     IFP            v_hook;
        !           258: 
        !           259:     int            v_flags;
        !           260: #define        V_NULL          0x00
        !           261: #define        V_RDONLY        0x01
        !           262: };
        !           263: 
        !           264: struct var *getvar ();
        !           265: 
        !           266: 
        !           267: static struct var vars[] = {
        !           268:     "debug", &debug, "debug FRED", bool,
        !           269:        NULLCP, NULLIFP, V_NULL,
        !           270: 
        !           271:     "manager", NULLIP, "mail address of local white pages manager", &manager,
        !           272:        NULLCP, NULLIFP, V_RDONLY,
        !           273: 
        !           274:     "namesearch", &nametype, "type of name used for matching", names,
        !           275:        NULLCP, NULLIFP, V_NULL,
        !           276: 
        !           277:     "pager", NULLIP, "program to use for output pagination", &pager,
        !           278:        NULLCP, NULLIFP, V_RDONLY,
        !           279: 
        !           280:     "phone", &phone, "display phone numbers in one-liner", bool,
        !           281:        NULLCP, NULLIFP, V_NULL,
        !           282: 
        !           283:     "query", &query, "confirm two-step operations", bool,
        !           284:        NULLCP, NULLIFP, V_NULL,
        !           285: 
        !           286:     "soundex", &soundex, "use soundex for matching", bool,
        !           287:        NULLCP, NULLIFP, V_NULL,
        !           288: 
        !           289:     "timelimit", &timelimit, "maximum time (in seconds) for matching", NULLVP,
        !           290:        NULLCP, NULLIFP, V_NULL,
        !           291: 
        !           292:     "verbose", &verbose, "verbose interaction", bool,
        !           293:        NULLCP, NULLIFP, V_NULL,
        !           294: 
        !           295:     "watch", &watch, "watch dialogue with dish", bool,
        !           296:        NULLCP, NULLIFP, V_NULL,
        !           297: 
        !           298:     NULL
        !           299: };
        !           300: 
        !           301: 
        !           302: static int varwidth1;
        !           303: static int varwidth2;
        !           304: 
        !           305: char    **getval ();
        !           306: 
        !           307: /*  */
        !           308: 
        !           309: static int  f_set (vec)
        !           310: char  **vec;
        !           311: {
        !           312:     register int    i,
        !           313:                    j;
        !           314:     int     value,
        !           315:            vflag;
        !           316:     register char **cp,
        !           317:                   *dp;
        !           318:     register struct var *v;
        !           319: 
        !           320:     if (*++vec == NULL) {
        !           321:        register int    w;
        !           322:        int     columns,
        !           323:                width,
        !           324:                lines;
        !           325:        register struct var *u;
        !           326: 
        !           327:        for (u = vars; u -> v_name; u++)
        !           328:            continue;
        !           329:        width = varwidth1;
        !           330: 
        !           331:        if ((columns = ncols (stdout) / (width = (width + 8) & ~7)) == 0)
        !           332:            columns = 1;
        !           333:        lines = ((u - vars) + columns - 1) / columns;
        !           334: 
        !           335:        printf ("Variables:\n");
        !           336:        for (i = 0; i < lines; i++)
        !           337:            for (j = 0; j < columns; j++) {
        !           338:                v = vars + j * lines + i;
        !           339:                printf ("%s", v -> v_name);
        !           340:                if (v + lines >= u) {
        !           341:                    printf ("\n");
        !           342:                    break;
        !           343:                }
        !           344:                for (w = strlen (v -> v_name); w < width; w = (w + 8) & ~7)
        !           345:                    (void) putchar ('\t');
        !           346:            }
        !           347: 
        !           348:        return OK;
        !           349:     }
        !           350: 
        !           351:     if (strcmp (*vec, "-help") == 0) {
        !           352:        fprintf (stdfp, "set [variable [value]]\n");
        !           353:        fprintf (stdfp,
        !           354:                 "    with no arguments, lists variables which may be set\n");
        !           355:        fprintf (stdfp,
        !           356:                 "    with one argument, lists the value of the named variable\n");
        !           357:        fprintf (stdfp,
        !           358:                 "    with two arguments, sets the given variable accordingly\n");
        !           359: 
        !           360:        return OK;
        !           361:     }
        !           362:     
        !           363:     if (strcmp (*vec, "?") == 0) {
        !           364:        for (v = vars; v -> v_name; v++)
        !           365:            printvar (v);
        !           366: 
        !           367:        return OK;
        !           368:     }
        !           369: 
        !           370:     if ((v = getvar (*vec)) == NULL)
        !           371:        return OK;
        !           372: 
        !           373:     if (*++vec == NULL) {
        !           374:        printvar (v);
        !           375: 
        !           376:        return OK;
        !           377:     }
        !           378: 
        !           379:     if (readonly && (v -> v_flags & V_RDONLY)) {
        !           380:        advise (NULLCP, "variable is read-only");
        !           381:        return OK;
        !           382:     }
        !           383: 
        !           384:     if (strcmp (*vec, "?") == 0) {
        !           385:        if (v -> v_value && (cp = v -> v_dvalue)) {
        !           386:            printf ("use %s of:", v -> v_mask ? "any" : "one");
        !           387:            for (i = 0; *cp; cp++)
        !           388:                printf ("%s \"%s\"", i++ ? "," : "", *cp);
        !           389:            if (v -> v_mask)
        !           390:                printf (";\n\tor  \"all\";\n\tor a hexadecimal number from 0 to 0x%x\n",
        !           391:                    (1 << (i - 1)) - 1);
        !           392:            else
        !           393:                printf (";\n\tor a number from 0 to %d\n",
        !           394:                    cp - v -> v_dvalue - 1);
        !           395:        }
        !           396:        else
        !           397:            printf ("use any %s value\n",
        !           398:                    v -> v_value ? "integer" : "string");
        !           399: 
        !           400:        return OK;
        !           401:     }
        !           402: 
        !           403:     if (v -> v_value == NULLIP) {
        !           404:        register int    w;
        !           405: 
        !           406:        if (*v -> v_dvalue)
        !           407:            free (*v -> v_dvalue);
        !           408:        *v -> v_dvalue = strdup (*vec);
        !           409:        if ((w = strlen (*v -> v_dvalue) + 2) > varwidth2)
        !           410:            varwidth2 = w;
        !           411:        if (v -> v_hook)
        !           412:            (*v -> v_hook) (v);
        !           413:        if (verbose)
        !           414:            printvar (v);
        !           415:        return OK;
        !           416:     }
        !           417: 
        !           418:     if (v -> v_mask) {
        !           419:        if (strcmp (dp = *vec, "all") == 0 && (cp = v -> v_dvalue)) {
        !           420:            i = 1;
        !           421:            while (*++cp)
        !           422:                i <<= 1;
        !           423:            value = i - 1;
        !           424:            j = 1;
        !           425:        }
        !           426:        else {
        !           427:            if (strncmp (dp, "0x", 2) == 0)
        !           428:                dp += 2;
        !           429:            for (j = sscanf (dp, "%x", &value); *dp; dp++)
        !           430:                if (!isxdigit (*dp)) {
        !           431:                    j = 0;
        !           432:                    break;
        !           433:                }
        !           434:        }
        !           435:     }
        !           436:     else
        !           437:        j = sscanf (*vec, "%d", &value);
        !           438: 
        !           439:     if (j == 1) {
        !           440:        if (cp = v -> v_dvalue) {
        !           441:            if (v -> v_mask) {
        !           442:                i = 1;
        !           443:                while (*++cp)
        !           444:                    i <<= 1;
        !           445:                if (value >= i)
        !           446:                    goto out_of_range;
        !           447:            }
        !           448:            else {
        !           449:                for (; *cp; cp++)
        !           450:                    continue;
        !           451:                if (value >= cp - v -> v_dvalue) {
        !           452: out_of_range: ;
        !           453:                    advise (NULLCP, "value out of range \"%s\"", *vec);
        !           454: 
        !           455:                    return OK;
        !           456:                }
        !           457:            }
        !           458:        }
        !           459: 
        !           460:        vflag = verbose;
        !           461:        *v -> v_value = value;
        !           462:        if (v -> v_hook)
        !           463:            (*v -> v_hook) (v);
        !           464:        if (vflag)
        !           465:            printvar (v);
        !           466: 
        !           467:        return OK;
        !           468:     }
        !           469: 
        !           470:     if (v -> v_mask) {
        !           471:        i = 0;
        !           472:        for (; *vec; vec++) {
        !           473:            if (!(cp = getval (*vec, v -> v_dvalue))) {
        !           474:                advise (NULLCP, "bad value \"%s\"", *vec);
        !           475: 
        !           476:                return OK;
        !           477:            }
        !           478:            if ((j = cp - v -> v_dvalue) <= 0)
        !           479:                continue;
        !           480: 
        !           481:            i |= 1 << (j - 1);
        !           482:        }
        !           483: 
        !           484:        vflag = verbose;
        !           485:        *v -> v_value = i;
        !           486:        if (v -> v_hook)
        !           487:            (*v -> v_hook) (v);
        !           488:        if (vflag)
        !           489:            printvar (v);
        !           490: 
        !           491:        return OK;
        !           492:     }
        !           493: 
        !           494:     if (v -> v_dvalue && (cp = getval (*vec, v -> v_dvalue))) {
        !           495:        vflag = verbose;
        !           496:        *v -> v_value = cp - v -> v_dvalue;
        !           497:        if (v -> v_hook)
        !           498:            (*v -> v_hook) (v);
        !           499:        if (vflag)
        !           500:            printvar (v);
        !           501:     }
        !           502:     else
        !           503:        if (!v -> v_dvalue)
        !           504:            advise (NULLCP, "bad value \"%s\"", *vec);
        !           505: 
        !           506:     return OK;
        !           507: }
        !           508: 
        !           509: /*  */
        !           510: 
        !           511: static printvar (v)
        !           512: register struct var *v;
        !           513: {
        !           514:     int            i;
        !           515:     char    buffer[BUFSIZ];
        !           516: 
        !           517:     if (runcom)
        !           518:        return;
        !           519: 
        !           520:     printf ("%-*s = ", varwidth1, v -> v_name);
        !           521:     if (v -> v_value) {
        !           522:        i = *v -> v_value;
        !           523: 
        !           524:        if (v -> v_mask) {
        !           525:            if (v -> v_dvalue) {
        !           526:                if (i == 0)
        !           527:                    printf ("%-*s", varwidth2, v -> v_dvalue[i]);
        !           528:                else {
        !           529:                    (void) strcpy (buffer, sprintb (i, v -> v_mask));
        !           530:                    if (strlen (buffer) <= varwidth2)
        !           531:                        printf ("%-*s", varwidth2, buffer);
        !           532:                    else
        !           533:                        printf ("%s\n%*s", buffer, varwidth1 + varwidth2 + 3,
        !           534:                                "");
        !           535:                }
        !           536:            }
        !           537:            else
        !           538:                printf ("0x%-*x", varwidth2 - 2, i);
        !           539:        }
        !           540:        else {
        !           541:            if (v -> v_dvalue)
        !           542:                printf ("%-*s", varwidth2, v -> v_dvalue[i]);
        !           543:            else
        !           544:                printf ("%-*d", varwidth2, i);
        !           545:        }
        !           546:     }
        !           547:     else
        !           548:        if (*v -> v_dvalue) {
        !           549:            (void) sprintf (buffer, "\"%s\"", *v -> v_dvalue);
        !           550:            printf ("%-*s", varwidth2, buffer);
        !           551:        }
        !           552:     printf ("    - %s\n", v -> v_dname);
        !           553: }
        !           554: 
        !           555: /*  */
        !           556: 
        !           557: static char **getval (name, choices)
        !           558: register char *name;
        !           559: char   **choices;
        !           560: {
        !           561:     register int    longest,
        !           562:                     nmatches;
        !           563:     register char  *p,
        !           564:                    *q,
        !           565:                   **cp,
        !           566:                   **fp;
        !           567:     char    buffer[BUFSIZ];
        !           568: 
        !           569:     longest = nmatches = 0;
        !           570:     for (cp = choices; p = *cp; cp++) {
        !           571:        for (q = name; *q == *p++; q++)
        !           572:            if (*q == NULL)
        !           573:                return cp;
        !           574:        if (*q == NULL)
        !           575:            if (q - name > longest) {
        !           576:                longest = q - name;
        !           577:                nmatches = 1;
        !           578:                fp = cp;
        !           579:            }
        !           580:            else
        !           581:                if (q - name == longest)
        !           582:                    nmatches++;
        !           583:     }
        !           584: 
        !           585:     switch (nmatches) {
        !           586:        case 0: 
        !           587:            advise (NULLCP, "unknown value \"%s\"", name);
        !           588:            return NULL;
        !           589: 
        !           590:        case 1: 
        !           591:            return fp;
        !           592: 
        !           593:        default: 
        !           594:            for (cp = choices, p = buffer; q = *cp; cp++)
        !           595:                if (strncmp (q, name, longest) == 0) {
        !           596:                    (void) sprintf (p, "%s \"%s\"", p != buffer ? "," : "", q);
        !           597:                    p += strlen (p);
        !           598:                }
        !           599:            advise (NULLCP, "ambiguous value, it could be one of:%s",
        !           600:                    buffer);
        !           601:            return NULL;
        !           602:     }
        !           603: }
        !           604: 
        !           605: /*  */
        !           606: 
        !           607: static char *ignore[] = {
        !           608:     "level", "listings", "verify", NULL
        !           609: };
        !           610: 
        !           611: 
        !           612: static struct var *getvar (name)
        !           613: register char *name;
        !           614: {
        !           615:     register int    longest,
        !           616:                     nmatches;
        !           617:     register char  *p,
        !           618:                    *q,
        !           619:                 **ip;
        !           620:     char    buffer[BUFSIZ];
        !           621:     register struct var *v,
        !           622:                        *f;
        !           623: 
        !           624:     if (runcom)
        !           625:        for (ip = ignore; *ip; ip++)
        !           626:            if (lexequ (*ip, name) == 0)
        !           627:                return NULL;
        !           628: 
        !           629:     longest = nmatches = 0;
        !           630:     for (v = vars; p = v -> v_name; v++) {
        !           631:        for (q = name; *q == *p++; q++)
        !           632:            if (*q == NULL)
        !           633:                return v;
        !           634:        if (*q == NULL)
        !           635:            if (q - name > longest) {
        !           636:                longest = q - name;
        !           637:                nmatches = 1;
        !           638:                f = v;
        !           639:            }
        !           640:            else
        !           641:                if (q - name == longest)
        !           642:                    nmatches++;
        !           643:     }
        !           644: 
        !           645:     switch (nmatches) {
        !           646:        case 0: 
        !           647:            advise (NULLCP, "unknown variable \"%s\"", name);
        !           648:            return NULL;
        !           649: 
        !           650:        case 1: 
        !           651:            return f;
        !           652: 
        !           653:        default: 
        !           654:            for (v = vars, p = buffer; q = v -> v_name; v++)
        !           655:                if (strncmp (q, name, longest) == 0) {
        !           656:                    (void) sprintf (p, "%s \"%s\"", p != buffer ? "," : "", q);
        !           657:                    p += strlen (p);
        !           658:                }
        !           659:            advise (NULLCP, "ambiguous variable, it could be one of:%s",
        !           660:                        buffer);
        !           661:            return NULL;
        !           662:     }
        !           663: }
        !           664: 
        !           665: /*    HELP */
        !           666: 
        !           667: static int helpwidth;
        !           668: 
        !           669: /*  */
        !           670: 
        !           671: int    f_help (vec)
        !           672: char  **vec;
        !           673: {
        !           674:     register int    i,
        !           675:                     j,
        !           676:                     w;
        !           677:     int     columns,
        !           678:             width,
        !           679:             lines;
        !           680:     register struct dispatch   *ds,
        !           681:                                *es;
        !           682: 
        !           683:     if (network || vec == NULL) {
        !           684:        register char **ap;
        !           685: 
        !           686:        for (ap = whois_help; *ap; ap++)
        !           687:            fprintf (stdfp, "%s%s", *ap, EOLN);
        !           688: 
        !           689:        return OK;
        !           690:     }
        !           691: 
        !           692:     for (es = dispatches; es -> ds_name; es++)
        !           693:        continue;
        !           694:     width = helpwidth;
        !           695: 
        !           696:     if (*++vec == NULL) {
        !           697:        if ((columns = ncols (stdout) / (width = (width + 8) & ~7)) == 0)
        !           698:            columns = 1;
        !           699:        lines = ((es - dispatches) + columns - 1) / columns;
        !           700: 
        !           701:        printf ("Operations:\n");
        !           702:        for (i = 0; i < lines; i++)
        !           703:            for (j = 0; j < columns; j++) {
        !           704:                ds = dispatches + j * lines + i;
        !           705:                printf ("%s", ds -> ds_name);
        !           706:                if (ds + lines >= es) {
        !           707:                    printf ("\n");
        !           708:                    break;
        !           709:                }
        !           710:                for (w = strlen (ds -> ds_name); w < width; w = (w + 8) & ~7)
        !           711:                    (void) putchar ('\t');
        !           712:            }
        !           713:        printf ("\n");
        !           714: 
        !           715:        return OK;
        !           716:     }
        !           717: 
        !           718:     if (strcmp (*vec, "-help") == 0) {
        !           719:        fprintf (stdfp, "help [commands ...]\n");
        !           720:        fprintf (stdfp,
        !           721:                 "    with no arguments, lists operations which may be invoked\n");
        !           722:        fprintf (stdfp,
        !           723:                 "    otherwise prints help for each operation given\n");
        !           724: 
        !           725:        return OK;
        !           726:     }
        !           727:     
        !           728:     for (; *vec; vec++)
        !           729:        if (strcmp (*vec, "?") == 0) {
        !           730:            for (ds = dispatches; ds -> ds_name; ds++)
        !           731:                printf ("%-*s\t- %s\n", width, ds -> ds_name, ds -> ds_help);
        !           732: 
        !           733:            break;
        !           734:        }
        !           735:        else
        !           736:            if (ds = getds (*vec))
        !           737:                printf ("%-*s\t- %s\n", width, ds -> ds_name, ds -> ds_help);
        !           738: 
        !           739:     return OK;
        !           740: }
        !           741: 
        !           742: /*    MISCELLANY */
        !           743: 
        !           744: rcinit ()
        !           745: {
        !           746:     register int    w;
        !           747:     register char **cp,
        !           748:                   *dp;
        !           749:     char    buffer[BUFSIZ];
        !           750:     register struct dispatch   *ds;
        !           751:     register struct var *v;
        !           752: 
        !           753:     if (fflag)
        !           754:        return;
        !           755: 
        !           756:     if ((myhome = getenv ("HOME")) == NULL)
        !           757:        myhome = ".";           /* could do passwd search... */
        !           758: 
        !           759:     if ((myuser = getenv ("USER")) == NULLCP)
        !           760:        myuser = getenv ("LOGNAME");
        !           761: 
        !           762:     if (dp = getenv ("QUIPURC"))
        !           763:        (void) strcpy (buffer, dp);
        !           764:     else
        !           765:        (void) sprintf (buffer, "%s/.quipurc", myhome);
        !           766:     snarf (buffer, "username:", &mydn);
        !           767: 
        !           768:     for (ds = dispatches, helpwidth = 0; ds -> ds_name; ds++)
        !           769:        if ((w = strlen (ds -> ds_name)) > helpwidth)
        !           770:            helpwidth = w;
        !           771: 
        !           772:     for (v = vars, varwidth1 = 0; v -> v_name; v++) {
        !           773:        if ((w = strlen (v -> v_name)) > varwidth1)
        !           774:            varwidth1 = w;
        !           775: 
        !           776:        if (v -> v_value) {
        !           777:            if (cp = v -> v_dvalue) {
        !           778:                if (v -> v_mask) {
        !           779: #ifdef notdef
        !           780:                    w = 1;
        !           781:                    while (*++cp)
        !           782:                        w <<= 1;
        !           783:                    w--;
        !           784:                    if ((w = strlen (sprintb (w, v -> v_mask))) > varwidth2)
        !           785:                        varwidth2 = w;
        !           786: #endif
        !           787:                }
        !           788:                else
        !           789:                    for (; *cp; cp++)
        !           790:                        if ((w = strlen (*cp)) > varwidth2)
        !           791:                            varwidth2 = w;
        !           792:            }
        !           793:        }
        !           794:        else
        !           795:            if (*v -> v_dvalue) {
        !           796:                *v -> v_dvalue = strdup (*v -> v_dvalue);
        !           797:                if ((w = strlen (*v -> v_dvalue) + 2) > varwidth2)
        !           798:                    varwidth2 = w;
        !           799:            }
        !           800:     }
        !           801: }
        !           802: 
        !           803: /*  */
        !           804: 
        !           805: static snarf (file, name, variable)
        !           806: char   *file,
        !           807:        *name,
        !           808:       **variable;
        !           809: {
        !           810:     int            i;
        !           811:     register char   *bp,
        !           812:                    *dp,
        !           813:                    *ep;
        !           814:     char    buffer[BUFSIZ];
        !           815:     FILE   *fp;
        !           816: 
        !           817:     if (fp = fopen (file, "r")) {
        !           818:        while (fgets (bp = buffer, sizeof buffer, fp)) {
        !           819:            if (*bp == '#' || *bp == '\n')
        !           820:                continue;
        !           821:            if (bp = index (buffer, '\n'))
        !           822:                *bp = NULL;
        !           823:            if (lexnequ (buffer, name, strlen (name)))
        !           824:                continue;
        !           825: 
        !           826:            bp = buffer + strlen (name);
        !           827:            while (isspace (*bp))
        !           828:                bp++;
        !           829: 
        !           830:            if (*bp == '"') {
        !           831:                if (*(dp = bp + strlen (bp) - 1) == '"')
        !           832:                    bp++, *dp = NULL;
        !           833:                goto set_variable;
        !           834:            }
        !           835:            
        !           836:            i = 0;
        !           837:            for (dp = ep = bp; *dp; ) {
        !           838:                if (isspace (*dp)) {
        !           839:                    *ep = ' ';
        !           840:                    while (isspace (*++dp))
        !           841:                        i = 1;
        !           842:                    if (*dp)
        !           843:                        ep++;
        !           844:                    else
        !           845:                        break;
        !           846:                }
        !           847:                if (i == 1)
        !           848:                    *ep = *dp;
        !           849: 
        !           850:                dp++, ep++;
        !           851:            }
        !           852:            *ep = NULL;
        !           853: 
        !           854: set_variable: ;
        !           855:            if (*variable)
        !           856:                free (*variable);
        !           857:            *variable = strdup (bp);
        !           858:            break;
        !           859:        }
        !           860: 
        !           861:        (void) fclose (fp);
        !           862:     }
        !           863: }
        !           864: 
        !           865: /*  */
        !           866: 
        !           867: rcfile (file, op, isystem)
        !           868: char   *file;
        !           869: int    op,
        !           870:        isystem;
        !           871: {
        !           872:     register char *cp;
        !           873:     char    buffer[BUFSIZ + 1],
        !           874:           *vec[NVEC + 1];
        !           875:     register FILE *fp;
        !           876:     struct stat st;
        !           877: 
        !           878:     if ((fp = fopen (file, "r")) == NULL)
        !           879:        return;
        !           880: 
        !           881:     runcom = 1, runsys = isystem;
        !           882:     if (fstat (fileno (fp), &st) == NOTOK)
        !           883:        adios (file, "unable to fstat");
        !           884:     rcmode = st.st_mode & 0777;
        !           885: 
        !           886:     while (fgets (buffer, sizeof buffer, fp)) {
        !           887:        if (*buffer == '#')
        !           888:            continue;
        !           889:        if (cp = index (buffer, '\n'))
        !           890:            *cp = NULL;
        !           891: 
        !           892:        bzero ((char *) vec, sizeof vec);
        !           893:        if (str2vecY (buffer, vec) < 1)
        !           894:            continue;
        !           895: 
        !           896:        if (fredloop (vec, NOTOK) != OK && op) {
        !           897:            (void) f_quit (NULLVP);
        !           898:            exit (1);
        !           899:        }
        !           900:     }
        !           901: 
        !           902:     runcom = 0;
        !           903: 
        !           904:     (void) fclose (fp);
        !           905: }
        !           906: 
        !           907: /*  */
        !           908: 
        !           909: #ifndef        TIOCGWINSZ
        !           910: /* ARGSUSED */
        !           911: #endif
        !           912: 
        !           913: int    ncols (fp)
        !           914: FILE *fp;
        !           915: {
        !           916: #ifdef TIOCGWINSZ
        !           917:     int            i;
        !           918:     struct winsize ws;
        !           919: 
        !           920:     if (ioctl (fileno (fp), TIOCGWINSZ, (char *) &ws) != NOTOK
        !           921:            && (i = ws.ws_col) > 0)
        !           922:        return i;
        !           923: #endif
        !           924: 
        !           925:     return 80;
        !           926: }
        !           927: 

unix.superglobalmegacorp.com

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