Annotation of 43BSDReno/contrib/isode-beta/others/image/imagesbr.c, revision 1.1.1.1

1.1       root        1: /* imagesbr.c - image subroutines */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/others/image/RCS/imagesbr.c,v 7.4 90/04/18 08:50:12 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/others/image/RCS/imagesbr.c,v 7.4 90/04/18 08:50:12 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       imagesbr.c,v $
                     12:  * Revision 7.4  90/04/18  08:50:12  mrose
                     13:  * typo
                     14:  * 
                     15:  * Revision 7.3  90/03/29  20:39:18  mrose
                     16:  * update
                     17:  * 
                     18:  * Revision 7.2  90/03/15  11:18:10  mrose
                     19:  * quipu-sync
                     20:  * 
                     21:  * Revision 7.1  90/03/08  08:04:12  mrose
                     22:  * touch-up
                     23:  * 
                     24:  * Revision 7.0  89/11/23  21:59:58  mrose
                     25:  * Release 6.0
                     26:  * 
                     27:  */
                     28: 
                     29: /*
                     30:  *                               NOTICE
                     31:  *
                     32:  *    Acquisition, use, and distribution of this module and related
                     33:  *    materials are subject to the restrictions of a license agreement.
                     34:  *    Consult the Preface in the User's Manual for the full terms of
                     35:  *    this agreement.
                     36:  *
                     37:  */
                     38: 
                     39: 
                     40: #include <ctype.h>
                     41: #include <stdio.h>
                     42: #include <varargs.h>
                     43: #include "imagesbr.h"
                     44: #include "quipu/bind.h"
                     45: #include "quipu/ds_search.h"
                     46: #include "quipu/entry.h"
                     47: 
                     48: /*    GENERAL */
                     49: 
                     50: static char *myname = "image";
                     51: 
                     52: int    recording = 0;
                     53: 
                     54: static LLog _pgm_log = {
                     55:     "./image.log", NULLCP, NULLCP, LLOG_FATAL | LLOG_EXCEPTIONS | LLOG_NOTICE,
                     56:     LLOG_FATAL, -1, LLOGCLS | LLOGCRT | LLOGZER, NOTOK
                     57: };
                     58: LLog *pgm_log = &_pgm_log;
                     59: 
                     60: 
                     61: /*    AKA */
                     62: 
                     63: struct aka {
                     64:     struct aka *ak_forw;
                     65:     struct aka *ak_back;
                     66: 
                     67:     char   *ak_domain;
                     68:     char   *ak_local;
                     69: 
                     70:     struct dn_seq *ak_bases;
                     71:     struct type_IMAGE_Image *ak_image;
                     72: };
                     73: static struct aka akas;
                     74: static struct aka *AHead = &akas;
                     75: 
                     76: 
                     77: static int  stay_bound = 0;
                     78: 
                     79: DN     local_dn;
                     80: 
                     81: 
                     82: struct dn_seq *dm2dn_seq ();
                     83: 
                     84: 
                     85: extern char *local_dit;
                     86: struct dn_seq *dn_seq_push ();
                     87: int    dn_seq_print ();
                     88: 
                     89: /*  */
                     90: 
                     91: void   init_aka (pgm, stayopen, dit)
                     92: char   *pgm,
                     93:        *dit;
                     94: int    stayopen;
                     95: {
                     96:     char   *cp;
                     97:     register struct aka *ak;
                     98:     static int once_only = 0;
                     99: 
                    100:     if (once_only == 0) {
                    101:        int     argp;
                    102:        char   *arg[2],
                    103:              **argptr;
                    104: 
                    105:        quipu_syntaxes ();
                    106: 
                    107:        argp = 0;
                    108:        arg[argp++] = myname;
                    109:        arg[argp] = NULLCP;
                    110:        
                    111:        dsap_init (&argp, (argptr = arg, &argptr));
                    112: 
                    113:        once_only = 1;
                    114:     }
                    115:     stay_bound = stayopen;
                    116:     myname = pgm;
                    117: 
                    118:     AHead -> ak_forw = AHead -> ak_back = AHead;
                    119:     if ((ak = (struct aka *) calloc (1, sizeof *ak)) == NULL)
                    120:        adios (NULLCP, "out of memory");
                    121: 
                    122:     ak -> ak_domain = ak -> ak_local = "";
                    123: 
                    124:     insque (ak, AHead -> ak_back);
                    125: 
                    126:     if ((local_dn = str2dn (cp = dit ? dit
                    127:                                     : *local_dit != '@' ? local_dit
                    128:                                                         : local_dit + 1))
                    129:            == NULLDN)
                    130:        adios (NULLCP, "local_dit invalid: \"%s\"", cp);
                    131: }
                    132: 
                    133: /*  */
                    134: 
                    135: static struct aka *mbox2ak (local, domain)
                    136: char   *local,
                    137:        *domain;
                    138: {
                    139:     register struct aka *ak,
                    140:                        *am;
                    141: 
                    142:     if (domain == NULL)
                    143:        domain = "";
                    144:     if (local == NULL)
                    145:        local = "";
                    146: 
                    147:     for (ak = AHead -> ak_forw; ak != AHead; ak = ak -> ak_forw)
                    148:        if (!lexequ (domain, ak -> ak_domain)
                    149:                && !lexequ (local, ak -> ak_local)) {
                    150:            if (recording)
                    151:                LLOG (pgm_log, LLOG_NOTICE,
                    152:                      ("hit \"%s\" \"%s\"", domain, local));
                    153: 
                    154:            return ak;
                    155:        }
                    156: 
                    157:     if ((am = (struct aka *) calloc (1, sizeof *am)) == NULL
                    158:            || (am -> ak_domain = strdup (domain)) == NULL
                    159:            || (am -> ak_local = strdup (local)) == NULL)
                    160:        adios (NULLCP, "out of memory");
                    161: 
                    162:     if (recording)
                    163:        LLOG (pgm_log, LLOG_NOTICE, ("miss \"%s\" \"%s\"", domain, local));
                    164: 
                    165:     if (index (domain, '.'))
                    166:        am -> ak_bases = dm2dn_seq (domain);
                    167:     else
                    168:        am -> ak_bases = dn_seq_push (local_dn, NULLDNSEQ);
                    169: 
                    170:     insque (ak = am, AHead);
                    171: 
                    172:     return ak;
                    173: }
                    174: 
                    175: /*    DIRECTORY */
                    176: 
                    177: #define        ADOMAIN "associatedDomain"
                    178: #define        PHOTO   "photo"
                    179: #define        USERID  "userid"
                    180: 
                    181: static int bound = 0;
                    182: static int dlevel = 0;
                    183: 
                    184: struct dn_seq *dm2dn_seq_aux ();
                    185: 
                    186: 
                    187: static struct dn_seq *dm2dn_seq (dm)
                    188: char   *dm;
                    189: {
                    190:     register char *dp;
                    191: 
                    192:     for (dp = dm; *dp; dp++)
                    193:        if (isupper (*dp))
                    194:            *dp = tolower (*dp);
                    195: 
                    196:     dlevel = 0;
                    197: 
                    198:     if (!bound && do_bind () == NOTOK)
                    199:        return NULLDNSEQ;
                    200: 
                    201:     return dm2dn_seq_aux (dm, NULLDN, NULLDNSEQ);
                    202: }
                    203: 
                    204: /*  */
                    205: 
                    206: static struct dn_seq *dm2dn_seq_aux (dm, dn, dlist)
                    207: char   *dm;
                    208: DN     dn;
                    209: struct dn_seq *dlist;
                    210: {
                    211:     register char   *dp;
                    212:     char   buffer[BUFSIZ];
                    213:     struct ds_search_arg search_arg;
                    214:     register struct ds_search_arg *sa = &search_arg;
                    215:     struct ds_search_result search_result;
                    216:     register CommonArgs *ca;
                    217:     register struct ds_search_result *sr = &search_result;
                    218:     struct DSError error;
                    219:     register struct DSError *se = &error;
                    220:     PS     ps;
                    221: 
                    222:     if ((ps = ps_alloc (str_open))
                    223:            && str_setup (ps, buffer, sizeof buffer, 1) != NOTOK) {
                    224:        dn_print (ps, dn, EDBOUT);
                    225:        *ps -> ps_ptr = NULL;
                    226:     }
                    227:     else
                    228:        buffer[0] = NULL;
                    229:     if (ps)
                    230:        (void) ps_free (ps);
                    231: 
                    232:     if (debug)
                    233:        fprintf (stderr, "dlevel=%d dm=%s dn=%s\n", dlevel, dm, buffer);
                    234: 
                    235:     bzero ((char *) sa, sizeof *sa);
                    236: 
                    237:     ca = &sa -> sra_common;
                    238:     ca -> ca_servicecontrol.svc_options = SVC_OPT_PREFERCHAIN;
                    239:     ca -> ca_servicecontrol.svc_prio = SVC_PRIO_LOW;
                    240:     ca -> ca_servicecontrol.svc_timelimit = SVC_NOTIMELIMIT;
                    241:     ca -> ca_servicecontrol.svc_sizelimit = SVC_NOSIZELIMIT;
                    242:     ca -> ca_servicecontrol.svc_scopeofreferral = SVC_REFSCOPE_NONE;
                    243: 
                    244:     sa -> sra_baseobject = dn;
                    245:     sa -> sra_subset = SRA_ONELEVEL;
                    246:     sa -> sra_searchaliases = FALSE;
                    247: 
                    248:     dp = dm;
                    249:     for (;;) {
                    250:        int         i;
                    251:        EntryInfo  *ptr;
                    252:        register filter *fi;
                    253:        register AttributeType at;
                    254: 
                    255:        if (debug)
                    256:            fprintf (stderr, "-- dlevel=%d dp=%s(%d) dn=%s\n",
                    257:                     dlevel, dp, strlen (dp), buffer);
                    258: 
                    259:        if ((i = strlen (dp)) < dlevel)
                    260:            break;
                    261: 
                    262:        sa -> sra_filter = fi = filter_alloc ();
                    263: 
                    264:        bzero ((char *) fi, sizeof *fi);
                    265:        fi -> flt_type = FILTER_ITEM;
                    266:        fi -> FUITEM.fi_type = FILTERITEM_EQUALITY;
                    267:        if ((fi -> FUITEM.UNAVA.ava_type = at = AttrT_new (ADOMAIN)) == NULL)
                    268:            adios ("invalid attribute type \"%s\"", ADOMAIN);
                    269:        fi -> FUITEM.UNAVA.ava_value =
                    270:            str2AttrV (dp, at -> at_table -> oa_syntax);
                    271: 
                    272:        if (ds_search (sa, se, sr) != DS_OK) {
                    273:            if (recording)
                    274:                LLOG (pgm_log, LLOG_EXCEPTIONS,
                    275:                      ("search operation failed"));
                    276: 
                    277:            (void) ds_unbind ();
                    278: 
                    279:            bound = 0;
                    280: 
                    281:            goto free_filter;
                    282:        }
                    283: 
                    284:        if (sr -> srr_correlated != TRUE)
                    285:            correlate_search_results (sr);
                    286: 
                    287:        if (sr -> CSR_entries == NULLENTRYINFO) {
                    288:            if (recording)
                    289:                LLOG (pgm_log, LLOG_NOTICE,
                    290:                      ("search for %s \"%s\" at baseobject \"%s\" failed",
                    291:                       ADOMAIN, dp, buffer));
                    292: 
                    293:            filter_free (sa -> sra_filter);
                    294:            if (dp = index (dp, '.'))
                    295:                dp++;
                    296:            if (dp == NULL)
                    297:                break;
                    298:            continue;
                    299:        }
                    300: 
                    301:        if (recording)
                    302:            LLOG (pgm_log, LLOG_NOTICE,
                    303:                  ("search for %s \"%s\" at baseobject \"%s\" succeeded",
                    304:                   ADOMAIN, dp, buffer));
                    305: 
                    306:        if (i > dlevel) {
                    307:            dlevel = i;
                    308:            if (dlist)
                    309:                dn_seq_free (dlist), dlist = NULLDNSEQ;
                    310:        }
                    311: 
                    312:        if (i == dlevel)
                    313:            for (ptr = sr -> CSR_entries; ptr; ptr = ptr -> ent_next) {
                    314:                struct dn_seq *dprev = dlist;
                    315:                (void) dn_decode (ptr -> ent_dn);
                    316: 
                    317:                dlist = dm2dn_seq_aux (dm, ptr -> ent_dn, dlist);
                    318: 
                    319:                if (dprev == dlist)
                    320:                    dlist = dn_seq_push (ptr -> ent_dn, dlist);
                    321:                else
                    322:                    if (i < dlevel)
                    323:                        break;
                    324:            }
                    325: 
                    326:        entryinfo_free (sr -> CSR_entries, 0);
                    327: free_filter: ;
                    328:        filter_free (sa -> sra_filter);
                    329:        break;
                    330:     }
                    331: 
                    332:     return dlist;
                    333: }
                    334: 
                    335: /*  */
                    336: 
                    337: static  PE  image_search (ak)
                    338: register struct aka *ak;
                    339: {
                    340:     register struct dn_seq *dlist;
                    341:     struct ds_search_arg search_arg;
                    342:     register struct ds_search_arg *sa = &search_arg;
                    343:     struct ds_search_result search_result;
                    344:     register CommonArgs *ca;
                    345:     register struct ds_search_result *sr = &search_result;
                    346:     struct DSError error;
                    347:     register struct DSError *se = &error;
                    348:     PE     pe = NULLPE;
                    349: 
                    350:     bzero ((char *) sa, sizeof *sa);
                    351: 
                    352:     ca = &sa -> sra_common;
                    353:     ca -> ca_servicecontrol.svc_options = SVC_OPT_PREFERCHAIN;
                    354:     ca -> ca_servicecontrol.svc_prio = SVC_PRIO_LOW;
                    355:     ca -> ca_servicecontrol.svc_timelimit = SVC_NOTIMELIMIT;
                    356:     ca -> ca_servicecontrol.svc_sizelimit = SVC_NOSIZELIMIT;
                    357:     ca -> ca_servicecontrol.svc_scopeofreferral = SVC_REFSCOPE_NONE;
                    358: 
                    359:     sa -> sra_subset = SRA_WHOLESUBTREE;
                    360:     sa -> sra_searchaliases = TRUE;
                    361: 
                    362:     if (recording) {
                    363:        LLOG (pgm_log, LLOG_NOTICE, ("searching for %s %s",
                    364:                                     ak -> ak_domain, ak -> ak_local));
                    365:        pslog (pgm_log, LLOG_NOTICE, "  using baseobjects ",
                    366:               dn_seq_print, (caddr_t) ak -> ak_bases);
                    367:     }
                    368: 
                    369:     for (dlist = ak -> ak_bases; dlist; dlist = dlist -> dns_next) {
                    370:        register filter *fi;
                    371:        register AttributeType at;
                    372: 
                    373:        if ((sa -> sra_baseobject = dlist -> dns_dn) == NULL)
                    374:            continue;
                    375: 
                    376:        sa -> sra_filter = fi = filter_alloc ();
                    377: 
                    378:        bzero ((char *) fi, sizeof *fi);
                    379:        fi -> flt_type = FILTER_ITEM;
                    380:        fi -> FUITEM.fi_type = FILTERITEM_EQUALITY;
                    381:        if ((fi -> FUITEM.UNAVA.ava_type = at = AttrT_new (USERID)) == NULL)
                    382:            adios ("invalid attribute type \"%s\"", USERID);
                    383:        fi -> FUITEM.UNAVA.ava_value =
                    384:            str2AttrV (ak -> ak_local, at -> at_table -> oa_syntax);
                    385: 
                    386:        sa -> sra_eis.eis_allattributes = FALSE;
                    387:        sa -> sra_eis.eis_select = as_comp_new (str2AttrT (PHOTO), NULLAV,
                    388:                                                NULLACL_INFO);
                    389:        sa -> sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
                    390: 
                    391:        if (ds_search (sa, se, sr) != DS_OK) {
                    392:            if (recording)
                    393:                LLOG (pgm_log, LLOG_EXCEPTIONS, ("search operation failed"));
                    394: 
                    395:            (void) ds_unbind ();
                    396: 
                    397:            bound = 0;
                    398: 
                    399:            goto free_filter;
                    400:        }
                    401: 
                    402:        if (sr -> srr_correlated != TRUE)
                    403:            correlate_search_results (sr);
                    404: 
                    405:        if (sr -> CSR_entries == NULLENTRYINFO) {
                    406:            if (recording)
                    407:                pslog (pgm_log, LLOG_NOTICE,
                    408:                      "search failed at baseobject ", dn_print,
                    409:                       (caddr_t) dlist -> dns_dn);
                    410:            filter_free (sa -> sra_filter);
                    411:            continue;
                    412:        }
                    413: 
                    414:        if (sr -> CSR_entries -> ent_attr == NULLATTR) {
                    415:            if (recording)
                    416:                pslog (pgm_log, LLOG_NOTICE,
                    417:                      "search succeeded (but no attribute) at baseobject ",
                    418:                       dn_print, (caddr_t) dlist -> dns_dn);
                    419:        }
                    420:        else {
                    421:            AttributeValue av = &sr -> CSR_entries -> ent_attr -> attr_value
                    422:                                                                   -> avseq_av;
                    423: 
                    424:            pe = (PE) av -> av_struct;
                    425:            av -> av_struct = NULL;
                    426: 
                    427:            if (recording)
                    428:                pslog (pgm_log, LLOG_NOTICE, "search succeeded at baseobject ",
                    429:                       dn_print, (caddr_t) dlist -> dns_dn);
                    430:        }
                    431: 
                    432:        entryinfo_free (sr -> CSR_entries, 0);
                    433: free_filter: ;
                    434:        filter_free (sa -> sra_filter);
                    435:        break;
                    436:     }
                    437: 
                    438:     return pe;
                    439: }
                    440: 
                    441: /*  */
                    442: 
                    443: static do_bind ()
                    444: {
                    445:     struct ds_bind_arg bind_arg,
                    446:                       bind_result;
                    447:     register struct ds_bind_arg *ba = &bind_arg,
                    448:                                *br = &bind_result;
                    449:     struct ds_bind_error bind_error;
                    450:     register struct ds_bind_error *be = &bind_error;
                    451: 
                    452:     bzero ((char *) ba, sizeof *ba);
                    453:     ba -> dba_version = DBA_VERSION_V1988;
                    454: 
                    455:     if (ds_bind (ba, be, br) != DS_OK) {
                    456:        if (recording)
                    457:            LLOG (pgm_log, LLOG_EXCEPTIONS,
                    458:                  ("directory bind failed: %s",
                    459:                   be -> dbe_type == DBE_TYPE_SECURITY ? "security error"
                    460:                                                       : "DSA unavailable"));
                    461: 
                    462:        return NOTOK;
                    463:     }
                    464: 
                    465:     bound = 1;
                    466: 
                    467:     return OK;
                    468: }
                    469: 
                    470: /*    IMAGE */
                    471: 
                    472: static int    passno;
                    473: static int    x, y, maxx;
                    474: 
                    475: static struct type_IMAGE_Image *im = NULL;
                    476: 
                    477: /*  */
                    478: 
                    479: struct type_IMAGE_Image *fetch_image (local, domain)
                    480: char   *local,
                    481:        *domain;
                    482: {
                    483:     PE     pe;
                    484:     PS     ps;
                    485:     register struct aka *ak;
                    486: 
                    487:     if ((ak = mbox2ak (local, domain)) == NULL)
                    488:        return NULL;
                    489:     if (ak -> ak_image)
                    490:        return ak -> ak_image;
                    491: 
                    492:     if (!bound && do_bind () == NOTOK)
                    493:        return NULL;
                    494: 
                    495:     if ((pe = image_search (ak)) == NULLPE)
                    496:        return NULL;
                    497: 
                    498:     if (!stay_bound) {
                    499:        (void) ds_unbind ();
                    500:        bound = 0;
                    501:     }
                    502: 
                    503:     im = NULL;
                    504:     
                    505:     if ((ps = ps_alloc (str_open)) == NULLPS) {
                    506:        if (debug)
                    507:            fprintf (stderr, "ps_alloc: failed\n");
                    508: 
                    509:        goto out;
                    510:     }
                    511:     if (str_setup (ps, NULLCP, 0, 0) == NOTOK) {
                    512:        if (debug)
                    513:            fprintf (stderr, "ps_alloc: %s\n", ps_error (ps -> ps_errno));
                    514: 
                    515:        goto out;
                    516:     }
                    517:     
                    518:     if (pe2ps (ps, pe) == NOTOK) {
                    519:        if (debug)
                    520:            fprintf (stderr, "pe2ps: %s\n", pe_error (pe -> pe_errno));
                    521: 
                    522:        goto out;
                    523:     }
                    524: 
                    525:     for (passno = 1; passno < 3; passno++)
                    526:        if (decode_t4 (ps -> ps_base, PHOTO, 0) == NOTOK) {
                    527:            fprintf (stderr, "\n");
                    528:            if (im) {
                    529:                qb_free (im -> data);
                    530:                free ((char *) im);
                    531:                im = NULL;
                    532:            }
                    533:            break;
                    534:        }
                    535: 
                    536: out: ;
                    537:     if (ps)
                    538:        ps_free (ps);
                    539:     pe_free (pe);
                    540: 
                    541:     return (ak -> ak_image = im);
                    542: }
                    543: 
                    544: /*  */
                    545: 
                    546: /* ARGSUSED */
                    547: 
                    548: photo_start (name)
                    549: char   *name;
                    550: {
                    551:     if (passno == 1)
                    552:        maxx = 0;
                    553:     x = y = 0;
                    554: 
                    555:     return OK;
                    556: }
                    557: 
                    558: 
                    559: /* ARGSUSED */
                    560: 
                    561: photo_end (name)
                    562: char   *name;
                    563: {
                    564:     int            len;
                    565:     register struct qbuf *qb,
                    566:                         *pb;
                    567:     
                    568:     if (passno == 1) {
                    569:        x = maxx, y--;
                    570: 
                    571:        if (debug)
                    572:            fprintf (stderr, "ending pass one for \"%s\", %dx%d\n",
                    573:                     name, x, y);
                    574: 
                    575:        if ((im = (struct type_IMAGE_Image *) calloc (1, sizeof *im))
                    576:                == NULL) {
                    577:            if (debug)
                    578:                fprintf (stderr, "calloc fails");
                    579:            return NOTOK;
                    580:        }
                    581:        im -> width = x, im -> height = y;
                    582: 
                    583:        len = ((im -> width + 7) / 8) * im -> height;
                    584:        if ((im -> data = qb = (struct qbuf *) malloc (sizeof *qb)) == NULL) {
                    585:            if (debug)
                    586:                fprintf (stderr, "unable to allocate qbuf");
                    587:            return NOTOK;
                    588:        }
                    589:        qb -> qb_forw = qb -> qb_back = qb;
                    590:        qb -> qb_data = NULL, qb -> qb_len = len;
                    591:        
                    592:        if ((pb = (struct qbuf *) calloc ((unsigned) (sizeof *pb + len), 1))
                    593:                == NULL) {
                    594:            if (debug)
                    595:                fprintf (stderr, "unable to allocate qbuf (%d+%d)",
                    596:                     sizeof *qb, len);
                    597:            return NOTOK;
                    598:        }
                    599:        pb -> qb_data = pb -> qb_base, pb -> qb_len = len;
                    600:        insque (pb, qb);
                    601:     }
                    602: 
                    603:     return OK;
                    604: }
                    605: 
                    606: 
                    607: photo_black (length)
                    608: int    length;
                    609: {
                    610:     if (passno == 2) {
                    611:        register int    i,
                    612:                        j;
                    613:        register unsigned char *cp;
                    614: 
                    615:        cp = (unsigned char *) im -> data -> qb_forw -> qb_data
                    616:                                       + ((im -> width + 7) / 8) * y + x / 8;
                    617:        i = x % 8;
                    618:        for (j = length; j > 0; j--) {
                    619:            *cp |= 1 << i;
                    620:            if (++i == 8)
                    621:                cp++, i = 0;
                    622:        }
                    623: 
                    624:     }
                    625: 
                    626:     x += length;
                    627: 
                    628:     return OK;
                    629: }
                    630: 
                    631: 
                    632: photo_white (length)
                    633: int    length;
                    634: {
                    635:     x += length;
                    636: 
                    637:     return OK;
                    638: }
                    639: 
                    640: 
                    641: /* ARGSUSED */
                    642: 
                    643: photo_line_end (line)
                    644: caddr_t line;
                    645: {
                    646:     if (passno == 1 && x > maxx)
                    647:        maxx = x;
                    648:     x = 0, y++;
                    649: 
                    650:     return OK;
                    651: }
                    652: 
                    653: /*    ERRORS */
                    654: 
                    655: #ifndef        lint
                    656: void   _advise ();
                    657: 
                    658: 
                    659: void   adios (va_alist)
                    660: va_dcl
                    661: {
                    662:     va_list ap;
                    663: 
                    664:     va_start (ap);
                    665: 
                    666:     _advise (ap);
                    667: 
                    668:     va_end (ap);
                    669: 
                    670:     _exit (1);
                    671: }
                    672: #else
                    673: /* VARARGS */
                    674: 
                    675: void   adios (what, fmt)
                    676: char   *what,
                    677:        *fmt;
                    678: {
                    679:     adios (what, fmt);
                    680: }
                    681: #endif
                    682: 
                    683: 
                    684: #ifndef        lint
                    685: void   advise (va_alist)
                    686: va_dcl
                    687: {
                    688:     va_list ap;
                    689: 
                    690:     va_start (ap);
                    691: 
                    692:     _advise (ap);
                    693: 
                    694:     va_end (ap);
                    695: }
                    696: 
                    697: 
                    698: static void  _advise (ap)
                    699: va_list        ap;
                    700: {
                    701:     char    buffer[BUFSIZ];
                    702: 
                    703:     asprintf (buffer, ap);
                    704: 
                    705:     (void) fflush (stdout);
                    706: 
                    707:     if (errsw != NOTOK) {
                    708:        fprintf (stderr, "%s: ", myname);
                    709:        (void) fputs (buffer, stderr);
                    710:        (void) fputc ('\n', stderr);
                    711: 
                    712:        (void) fflush (stderr);
                    713:     }    
                    714: }
                    715: #else
                    716: /* VARARGS */
                    717: 
                    718: void   advise (what, fmt)
                    719: char   *what,
                    720:        *fmt;
                    721: {
                    722:     advise (what, fmt);
                    723: }
                    724: #endif
                    725: 
                    726: /*    MISC */
                    727: 
                    728: #ifndef        lint
                    729: char   *strdup (s)
                    730: char   *s;
                    731: {
                    732:     char   *p;
                    733: 
                    734:     if (p = malloc ((unsigned) (strlen (s) + 1)))
                    735:        (void) strcpy (p, s);
                    736: 
                    737:     return p;
                    738: }
                    739: #endif

unix.superglobalmegacorp.com

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