Annotation of researchv10dc/cmd/library/option2.c, revision 1.1

1.1     ! root        1: /*     library:option2.c       1.30    */
        !             2: #include "sccsid.h"
        !             3: VERSION(@(#)library:option2.c  1.30)
        !             4: 
        !             5: /*****************   option2.c   *************/
        !             6: 
        !             7: /* this package handles option 2 of library. Basically this
        !             8:  * option consists of requests that can be formatted as forms
        !             9:  * to be filled in.  The forms all have the name 2.*.
        !            10:  * Every form must have a dashed line in it (a line starting with at least 10
        !            11:  * dashes) which separates control info from the actual form part.
        !            12:  *  Some conventions:
        !            13:  *     -  lines starting with a # are comments - above and below the dash line.
        !            14:  *     -  If one of the first two lines starts with a P (capital p) this is
        !            15:  *        what the user is shown to select from. Otherwise the file name.
        !            16:  *     - lines starting with a ? above the dash line are general comments.
        !            17:  *     - lines with a ? below the dash line are help for the previous query.
        !            18:  *
        !            19:  *  Each line ends with either
        !            20:  *     *number  saying a response is optional. max number lines is number.
        !            21:  *     +number  saying a response is manditory. max number lines is number.
        !            22:  */
        !            23: #include "gnamef.h"
        !            24: #include <stdio.h>
        !            25: #include <ctype.h>
        !            26: #include <string.h>
        !            27: char *malloc(), *realloc();
        !            28: char *ctime(), *getenv();
        !            29: void put_respond(), put_lib_file();
        !            30: 
        !            31: option2(logfile, argc, argv, optnum)
        !            32: FILE *logfile;
        !            33: int argc;
        !            34: char *argv[];
        !            35: int optnum;
        !            36:  {
        !            37:     char *response, filename[80], hold_where[100], what_avail[50],
        !            38:             format[150], tempname[60], instr[150], templine[200], query[80];
        !            39:     char *ptr, *eptr, *tptr, tchar, tchar2, *endptr, this_char, *dateptr,
        !            40:         *clptr, *beginptr, *editor, *tptr2;
        !            41:     char *libptr, *get_lib_file(), *find_respond();
        !            42:     extern char *Cmd, *whereto, libcntl[], pan[], req_name[], libfile[];
        !            43:     int i, j, k, ans, avail, num, numreq, resp_size, first, max, nolog,
        !            44:        multi_req, nodata, level, said_blank,
        !            45:        save_respond, respond_flag, use_respond;
        !            46:     int used_arg;      /* flag that arguments used in selection */
        !            47: #ifdef SVR4
        !            48:     time_t today;
        !            49: #else
        !            50:     long today;
        !            51: #endif
        !            52:     FILE *tfile, *popen(), *efile, *sendfile;
        !            53:     DIR *tdir;
        !            54: 
        !            55:     time(&today);
        !            56:     used_arg = respond_flag = level = 0;
        !            57:     strcpy(format, "Your %d requests have been sent\n");
        !            58:     dateptr = ctime(&today);
        !            59:     /* get initial space for responses */
        !            60:     nolog = said_blank = first = 0;
        !            61:     resp_size = 5000;
        !            62:     if ((response = malloc(resp_size)) == NULL) {
        !            63:        fprintf(stderr, "library: Couldn't get space for request (%d). No requests sent!\n", resp_size);
        !            64:        exit(1);
        !            65:        }
        !            66:     /* first count what is available - If only one say nothing */
        !            67:     tdir = opendir(WHERE);
        !            68:     avail = 0;
        !            69:     ptr = response;
        !            70:     while (gnamef(tdir, ptr) == TRUE) 
        !            71:        if ((atoi(ptr) == optnum) && (*(ptr+1) == '.')) {
        !            72:            avail++;
        !            73:            ptr += strlen(ptr) + 1;
        !            74:            }
        !            75:     closedir(tdir);
        !            76:     if (avail == 0) {
        !            77:        fprintf(stderr, "Nothing available via this option! No requests sent\n");
        !            78:        exit(1);
        !            79:        }
        !            80:     /* see if they already said what they want */
        !            81:     if (argc) {
        !            82:        tptr = argv[0];
        !            83:        if ((*tptr != '-') || ! isalnum(*(tptr+1)))  {
        !            84:            fprintf(stderr, "Confused arguments for option %d (%s)\?\? No requests sent\n", optnum, tptr);
        !            85:            exit(1);
        !            86:            }
        !            87:        ans = *(tptr+1);
        !            88:        argc--;
        !            89:        argv++;
        !            90:        }
        !            91:     else ans = 0;
        !            92:     eptr = ptr;
        !            93:     if (avail == 1) ans = -1;
        !            94:     else {
        !            95:        if (ans == 0) {
        !            96:            printf("The following types of material are available.\n");
        !            97:            printf("For more details on a given type do  <option number> ?.  E.g. p?\n\n");
        !            98:            }
        !            99:        /* use the file names - or D line in the library directory */
        !           100:        ptr = response;
        !           101:        for (this_char='1', j=1; j <= avail; j++, ptr += strlen(ptr) + 1) {
        !           102:            /* check if they say special words what to call it */
        !           103:            sprintf(eptr, "%s/%s", WHERE, ptr);
        !           104:            if ((tfile = fopen(eptr, "r")) == NULL) {
        !           105:                fprintf(stderr, "Can't read option file for %s\n", ptr+2);
        !           106:                continue;
        !           107:                }
        !           108:            /* scan to dash line for D line */
        !           109:            while (fgets(eptr, 150, tfile) != NULL) {
        !           110:                if (strncmp(eptr, "-----", 5) == 0) break;
        !           111:                if (*eptr == 'D')  break;
        !           112:                }
        !           113:            tptr = strchr(eptr, '\n');
        !           114:            fclose(tfile);
        !           115:            if (tptr != NULL) *tptr = '\0';
        !           116:            tptr = eptr + 1;
        !           117:            while ((*tptr == ' ') || (*tptr == '\t')) tptr++;
        !           118:            if ((*eptr != 'D') || ! *tptr) {
        !           119:                printf("  %c) %s\n\n", this_char, ptr+2);
        !           120:                if (ans == 0) what_avail[j-1] = this_char++;
        !           121:                continue;
        !           122:                }
        !           123:            if ((*(tptr+1) == '\0') || (*(tptr+1) == ' ') || (*(tptr+1) == '\t')) {
        !           124:                what_avail[j-1] = *tptr;
        !           125:                tptr++;
        !           126:                while ((*tptr == ' ') || (*tptr == '\t')) tptr++;
        !           127:                }
        !           128:            else {
        !           129:                what_avail[j-1] = this_char++;
        !           130:                }
        !           131:            if (ans != 0) continue;
        !           132:            if (!strlen(tptr)) 
        !           133:                printf("  %c) %s\n\n", what_avail[j-1], ptr+2);
        !           134:            else
        !           135:                printf("  %c) %s\n\n", what_avail[j-1], tptr);
        !           136:            }
        !           137:        } /* display of available options */
        !           138:     what_avail[j-1] = 0;
        !           139:     if (ans == -1) ans = 1;
        !           140:     else if (ans > 0) {
        !           141:        for (i=0; i < avail; i++)
        !           142:            if (ans == what_avail[i]) break;
        !           143:        i++;
        !           144:        if ((i < 1) || (i > avail)) {
        !           145:            fprintf(stderr, "Illegal option selected (%c). available are [%s]\n",
        !           146:                        ans, what_avail);
        !           147:            exit(1);
        !           148:            }
        !           149:        ans = i;
        !           150:        }
        !           151:     while (ans == 0) {
        !           152:        printf("Type desired: ");
        !           153:        if ((fgets(eptr, 80, stdin) == NULL) || (*eptr == '.')) {
        !           154:            fprintf(stderr, "No requests sent!!\n");
        !           155:            exit(1);
        !           156:            }
        !           157:        if ((tptr = strchr(eptr, '\n')) != NULL) *tptr = '\0';
        !           158:        if (!strlen(eptr)) {
        !           159:            printf("Please select from available options, . to exit, ? for help\n");
        !           160:            continue;
        !           161:            }
        !           162:        ptr = eptr + 1;
        !           163:        while ((*ptr == ' ') || (*ptr == '\t')) ptr++;
        !           164:        if ((*eptr == '?') && !isalnum(*ptr)) {
        !           165:            sprintf(eptr, "%s/option%d.help", WHERE, optnum);
        !           166:            if ((tfile = fopen(eptr, "r")) == NULL) {
        !           167:                printf("Sorry. General help on option %d not on this machine!\n",
        !           168:                            optnum);
        !           169:                continue;
        !           170:                }
        !           171:            while (fgets(instr, 150, tfile) != NULL)
        !           172:                    fputs(instr, stdout);
        !           173:            fclose(tfile);
        !           174:            continue;
        !           175:            }
        !           176:        if (*eptr == '?') {
        !           177:            tptr = ptr;
        !           178:            ptr = eptr;
        !           179:            eptr = tptr;
        !           180:            }
        !           181:        for (i=0; i < avail; i++)
        !           182:            if (*eptr == what_avail[i]) break;
        !           183:        i++;
        !           184:        if ((i < 1) || (i > avail)) {
        !           185:            fprintf(stderr, "Illegal option. Must be from list above (%s)\n", what_avail);
        !           186:            continue;
        !           187:            }
        !           188:        /* see if they want help */
        !           189:        if (*ptr == '?') {
        !           190:            ptr = response;
        !           191:            for (j = 1; j < i; j++) ptr += strlen(ptr) + 1;
        !           192:            sprintf(eptr, "%s/%s", WHERE, ptr);
        !           193:            if ((tfile = fopen(eptr, "r")) == NULL) {
        !           194:                fprintf(stderr, "Can't read option file for %s\n", ptr+2);
        !           195:                continue;
        !           196:                }
        !           197:            j = 0;
        !           198:            while (fgets(eptr, 150, tfile) != NULL) {
        !           199:                if (strncmp(eptr, "-----", 5) == 0) break;
        !           200:                if (*eptr == '?') {
        !           201:                    fputs(eptr+1, stdout);
        !           202:                    j++;
        !           203:                    }
        !           204:                }
        !           205:            fclose(tfile);
        !           206:            if (!j) printf("Sorry - no help available about %s\n", ptr+2);
        !           207:            continue;
        !           208:            } /* end giving of help */
        !           209:        ans = i;
        !           210:        } /* end more than one thype thing to choose from */
        !           211:     ptr = eptr = response;
        !           212:     numreq = 0;
        !           213:     for (j = 1; j < ans; j++) ptr += strlen(ptr) + 1;
        !           214:     sprintf(filename, "%s/%s", WHERE, ptr);
        !           215:     if ((tfile = fopen(filename, "r")) == NULL) {
        !           216:        fprintf(stderr, "library: Can't read selected option file for %s\n",
        !           217:                                ptr+2);
        !           218:        exit(1);
        !           219:        }
        !           220:     /* we may need the base of filename for saved responses below */
        !           221:     strcpy(filename, ptr);
        !           222: 
        !           223:     nodata = 0;
        !           224:     multi_req = 1;
        !           225:     while (1) {
        !           226:        endptr = eptr;
        !           227:        rewind(tfile);
        !           228:        while (fgets(eptr, 150, tfile) != NULL) {
        !           229:            if (strncmp(eptr, "-----", 5) == 0) break;
        !           230:            /* all set up already */
        !           231:            if (numreq) continue;
        !           232:            if (*eptr == 'S') {
        !           233:                eptr++;
        !           234:                while (*eptr == ' ' || (*eptr == '\t')) eptr++;
        !           235:                strcpy(response, eptr);
        !           236:                eptr = response + strlen(response); 
        !           237:                }
        !           238:            else if (strncmp(eptr, "NODATA", 6) == 0) {
        !           239:                nodata = 1;
        !           240:                }
        !           241:            else if (strncmp(eptr, "FORMAT", 6) == 0) {
        !           242:                tptr = eptr + 6;
        !           243:                while (*tptr && isspace(*tptr)) tptr++;
        !           244:                if (*tptr) strcpy(format, tptr);
        !           245:                }
        !           246:            else if (strncmp(eptr, "NOBLANKMSG", 10) == 0) {
        !           247:                said_blank = -1;
        !           248:                }
        !           249:            else if (strncmp(eptr, "NOLOG", 5) == 0) {
        !           250:                nolog = 1;
        !           251:                }
        !           252:            else if (strncmp(eptr, "LEVEL", 5) == 0) {
        !           253:                level = 1;
        !           254:                }
        !           255:            else if (strncmp(eptr, "ONE", 3) == 0) {
        !           256:                multi_req = 0;
        !           257:                }
        !           258:            else if (*eptr == 'M') {
        !           259:                tptr = eptr+1;
        !           260:                while (*tptr == ' ' || (*tptr == '\t')) tptr++;
        !           261:                if (strlen(tptr) > sizeof(hold_where)) continue;
        !           262:                strcpy(hold_where, tptr);
        !           263:                ptr = hold_where + strlen(hold_where);
        !           264:                while (!isalnum(*--ptr));
        !           265:                *++ptr = '\0';
        !           266:                if (strlen(hold_where)) whereto = hold_where;
        !           267:                }
        !           268:            else if (!first && (*eptr == 'H') && !argc) {
        !           269:                fputs(eptr+1, stdout);
        !           270:                }
        !           271:            }
        !           272:        if (strncmp(eptr, "-----", 5) != 0) {
        !           273:            fprintf(stderr, "library: No dash list for %s option form! No requests sent\n", ptr + 2);
        !           274:            exit(1);
        !           275:            }
        !           276:        if ((eptr == endptr) && !numreq) {
        !           277:            fprintf(stderr, "library: No Send line for this option! No requests sent\n");
        !           278:            exit(1);
        !           279:            }
        !           280:        /* don't just duplicate this if user wiped out last being entered */
        !           281:        if ((eptr < (response + 10)) || strncmp(eptr-6, "**-**", 5)) {
        !           282:                    strcpy(eptr, "**-**\n");
        !           283:                    eptr += strlen(eptr);
        !           284:                    }
        !           285:        endptr = eptr;
        !           286:        if ((said_blank == 0) && !argc) {
        !           287:            fprintf(stdout, "Use blank lines to end multi-line inputs\n");
        !           288:            said_blank++;
        !           289:            }
        !           290:        first++;
        !           291:        /* now read in an utilize the form */
        !           292:        while (fgets(eptr, 150, tfile) != NULL) {
        !           293:            /* Level handling */
        !           294:            if (level && (*eptr == '@')) {
        !           295:                if ((*(eptr+1)-'0') != level) continue;
        !           296:                strcpy(eptr, eptr+2);
        !           297:                }
        !           298:            /* skip comment and help lines */
        !           299:            if ((*eptr == '#') || (*eptr == '?')) continue;
        !           300:            /* check if getting low on space */
        !           301:            if ((resp_size - strlen(response)) < 500) {
        !           302:                resp_size += 5000;
        !           303:                ptr = response;
        !           304:                if ((response = realloc(response, resp_size)) == NULL) {
        !           305:                    fprintf(stderr, "library: Couldn't get space for this much request (%d). No requests sent!\n", resp_size);
        !           306:                    exit(1);
        !           307:                    }
        !           308:                eptr += (response - ptr);
        !           309:                endptr += (response - ptr);
        !           310:                }
        !           311:            /* find how much the user can respond  */
        !           312:            ptr = eptr + strlen(eptr) - 1;
        !           313:            if (*ptr == '\n') *ptr-- = '\0';
        !           314:            while (isdigit(*ptr) && (ptr > eptr)) ptr--;
        !           315:            num = atoi(ptr+1);
        !           316:            save_respond = 0;
        !           317:            if (*ptr == 'S') {
        !           318:                if (respond_flag == 0) {
        !           319:                    libptr = get_lib_file(libfile);
        !           320:                    if (libptr == NULL)
        !           321:                        respond_flag = -1;
        !           322:                    else
        !           323:                        respond_flag = 1;
        !           324:                    }
        !           325:                if ((respond_flag > 0) && (num == 1)) save_respond = 1;
        !           326:                ptr--;
        !           327:                }
        !           328:            if ((*ptr != '+') && (*ptr != '*')) {
        !           329:                if (!argc) printf("%s\n", eptr);
        !           330:                continue;
        !           331:                }
        !           332:            tchar = *ptr--;
        !           333:            while ((*ptr == ' ') || (*ptr == '\t')) ptr--;
        !           334:            *++ptr = '\0';
        !           335:            if (num == 0) num = 1;
        !           336:            /* save the query in case we need it later */
        !           337:            strcpy(query, eptr);
        !           338:            /* now get in a maximum of num lines */
        !           339:            strcat(eptr, ": ");
        !           340:            if (strlen(eptr) > 30) strcat(eptr, "\n\t");
        !           341:            beginptr = ptr = eptr + strlen(eptr);
        !           342:            j = 0;  /* use j to count the lines */
        !           343:            max = num;
        !           344:            use_respond = 0;
        !           345:            while (num-- > 0) {
        !           346:                /* check if saved response to this */
        !           347:                tptr = NULL;
        !           348:                if (!j && !argc && save_respond) {
        !           349:                    /* remove () expressions off query */
        !           350:                    tptr = query + strlen(query) - 1;
        !           351:                    if (*tptr == ')') {
        !           352:                        tptr = strrchr(query, '(');
        !           353:                        if (tptr != NULL) {
        !           354:                            while ((*tptr == ' ') || (*tptr == '\t') || (*tptr == '(')) tptr--;
        !           355:                            *++tptr = '\0';
        !           356:                            }
        !           357:                        }
        !           358:                    tptr = find_respond(libptr, filename, query);
        !           359:                    if (tptr != NULL) {
        !           360:                        printf("\nUse response \"%s\" for \"%s\"?\n     Enter y (or return) if okay, n to give new response: ",
        !           361:                                        tptr, query);
        !           362:                        if (fgets(ptr, 80, stdin) == NULL) {
        !           363:                            fprintf(stderr, "Input ended in middle? No requests sent\n");
        !           364:                            exit(1);
        !           365:                            }
        !           366:                        if ((clptr = strchr(ptr, '\n')) != NULL) *clptr = '\0';
        !           367:                        if ((*ptr == 'y') || (*ptr == 'Y') || !strlen(ptr)) {
        !           368:                            use_respond = 1;
        !           369:                            strcpy(ptr, tptr);
        !           370:                            num = 0;
        !           371:                            }
        !           372:                        else if (*ptr == '.') {
        !           373:                            use_respond = 1;
        !           374:                            strcpy(ptr, ".");
        !           375:                            }
        !           376:                        else
        !           377:                            *ptr = '\0';
        !           378:                        } /* end of response found in file */
        !           379:                    } /* deal with saved response */
        !           380:                if (!use_respond && !j && !argc) {
        !           381:                    printf("Enter %s", eptr);
        !           382:                    if (max >1)
        !           383:                        printf("(Allowed a maximum %d lines)\n==> ", max);
        !           384:                    else if (strlen(eptr) > 30)
        !           385:                        printf("\n==> ");
        !           386:                    }
        !           387:                else if (!argc && !use_respond) printf("==> ");
        !           388:                if (argc) {
        !           389:                    tptr = argv[0];
        !           390:                    if (*tptr == '-') tptr++;
        !           391:                    strcpy(ptr, tptr);
        !           392:                    argc--;
        !           393:                    argv++;
        !           394:                    used_arg = 1;
        !           395:                    }
        !           396:                else if (!use_respond && (fgets(ptr,500, stdin) == NULL)) {
        !           397:                    fprintf(stderr, "Input ended in middle? No requests sent\n");
        !           398:                    exit(1);
        !           399:                    }
        !           400:                if ((clptr = strchr(ptr, '\n')) != NULL) *clptr = '\0';
        !           401:                if (*ptr == '?') {
        !           402:                    /* give any help lines - make it so we can get back */
        !           403:                    i = ftell(tfile);
        !           404:                    k = 0;
        !           405:                    while (fgets(templine, 200, tfile) != NULL) {
        !           406:                        tptr = templine;
        !           407:                        if (*tptr == '#') continue;
        !           408:                        /* Level handling */
        !           409:                        if (level && (*tptr == '@')) {
        !           410:                            if ((*(tptr+1)-'0') != level) continue;
        !           411:                            tptr += 2;
        !           412:                            }
        !           413:                        if (*tptr == '#') continue;
        !           414:                        if (*tptr == '?') {
        !           415:                            if ((*(tptr+1) == '!') || (*(tptr+1) == '@'))
        !           416:                                    fputs(tptr+2, stdout);
        !           417:                            else
        !           418:                                fputs(tptr+1, stdout);
        !           419:                            k++;
        !           420:                            }
        !           421:                        else break;
        !           422:                        }
        !           423:                    if (!k) printf("Sorry - no help for this prompt!\n");
        !           424:                    fseek(tfile, (long)i, 0);
        !           425:                    num++;
        !           426:                    *ptr = '\0';
        !           427:                    continue;
        !           428:                    }
        !           429:                else if (*ptr == '.') {
        !           430:                    printf("A period wipes out a request. Use return (a blank line) to end input.\n");
        !           431:                    printf("  Wipe out request? (n): ");
        !           432:                    if (fgets(ptr, 80, stdin) == NULL) {
        !           433:                        fprintf(stderr, "Input ended in middle? No requests sent\n");
        !           434:                        exit(1);
        !           435:                        }
        !           436:                    if ((*ptr == 'y') || (*ptr == 'Y')) {
        !           437:                        j = -1;
        !           438:                        *eptr = '\0';
        !           439:                        break;
        !           440:                        }
        !           441:                    *ptr = '\0';
        !           442:                    num++;
        !           443:                    continue;
        !           444:                    }
        !           445:                else if (strncmp(ptr, "~e", 2) == 0) {
        !           446:                    if (max < 20) {
        !           447:                        fprintf(stderr, "Sorry - library() doesn't allow editer use on responses of %d lines\n", max);
        !           448:                        *ptr = '\0';
        !           449:                        num++;
        !           450:                        continue;
        !           451:                        }
        !           452:                    editor = getenv("EDITOR");
        !           453:                    if (editor == NULL) editor = "ed";
        !           454:                    *ptr = '\0';
        !           455:                    sprintf(tempname, "/tmp/Lo25.%d", getpid());
        !           456:                    if ((efile = fopen(tempname, "w")) == NULL) {
        !           457:                        fprintf(stderr, "Couldn't open tmp file %s for edit\n", tempname);
        !           458:                        *ptr = '\0';
        !           459:                        num++;
        !           460:                        continue;
        !           461:                        }
        !           462:                    if (strlen(beginptr)) {
        !           463:                        /* write out what is there - clean up start of lines */
        !           464:                        tptr = beginptr;
        !           465:                        while ((tptr != NULL) && *tptr) {
        !           466:                            while (*tptr && (*tptr == ' ') || (*tptr == '\t')) tptr++;
        !           467:                            tptr2 = strchr(tptr, '\n');
        !           468:                            if (tptr2 != NULL) *tptr2++ = '\0';
        !           469:                            fputs(tptr, efile);
        !           470:                            fputc('\n', efile);
        !           471:                            tptr = tptr2;
        !           472:                            }
        !           473:                        }
        !           474:                    fclose(efile);
        !           475:                    sprintf(ptr+1, "%s %s", editor, tempname);
        !           476:                    system(ptr+1);
        !           477:                    if ((efile = fopen(tempname, "r")) == NULL) {
        !           478:                        fprintf(stderr, "Couldn't open tmp file %s after edit\n", tempname);
        !           479:                        num++;
        !           480:                        *ptr = '\0';
        !           481:                        continue;
        !           482:                        }
        !           483:                    ptr = beginptr;
        !           484:                    while (fgets(ptr, 1000, efile) != NULL) {
        !           485:                                ptr += strlen(ptr);
        !           486:                                *ptr++ = '\t';
        !           487:                                j++;
        !           488:                                }
        !           489:                    *ptr = '\0';
        !           490:                    fclose(efile);
        !           491:                    unlink(tempname);
        !           492:                    printf("(Continue entry)\n");
        !           493:                    continue;
        !           494:                    }
        !           495:                else if (strncmp(ptr, "~r", 2) == 0) {
        !           496:                    if (max < 20) {
        !           497:                        fprintf(stderr, "Sorry - library() doesn't allow file reading on responses of %d lines\n", max);
        !           498:                        *ptr = '\0';
        !           499:                        num++;
        !           500:                        continue;
        !           501:                        }
        !           502:                    tptr = ptr;
        !           503:                    ptr += 2;
        !           504:                    while ((*ptr == ' ') || (*ptr == '\t')) ptr++;
        !           505:                    if ((efile = fopen(ptr, "r")) == NULL) {
        !           506:                        fprintf(stderr, "Couldn't open file %s for reading\n", ptr);
        !           507:                        num++;
        !           508:                        ptr = tptr;
        !           509:                        *ptr = '\0';
        !           510:                        continue;
        !           511:                        }
        !           512:                    ptr = tptr;
        !           513:                    while (fgets(ptr, 1000, efile) != NULL) {
        !           514:                        ptr += strlen(ptr);
        !           515:                        /* check if getting low on space */
        !           516:                        if ((resp_size - strlen(response)) < 500) {
        !           517:                            resp_size += 5000;
        !           518:                            tptr = response;
        !           519:                            if ((response = realloc(response, resp_size)) == NULL) {
        !           520:                                fprintf(stderr, "library: Couldn't get space for this much request (%d). No requests sent!\n", resp_size);
        !           521:                                exit(1);
        !           522:                                }
        !           523:                            ptr += (response - tptr);
        !           524:                            eptr += (response - tptr);
        !           525:                            endptr += (response - tptr);
        !           526:                            }
        !           527:                        *ptr++ = '\t';
        !           528:                        j++;
        !           529:                        }
        !           530:                    *ptr = '\0';
        !           531:                    fclose(efile);
        !           532:                    printf("(Continue entry)\n");
        !           533:                    continue;
        !           534:                    }
        !           535:                if (!strlen(ptr)) {
        !           536:                    if (!j && tchar == '+') {
        !           537:                        if (argc) {
        !           538:                            printf("Attempted to skip required input. Parameter handling stopped!\n");
        !           539:                            argc = 0;
        !           540:                            }
        !           541:                        printf("This input is required. Please enter a question mark (?) for help\n");
        !           542:                        num++;
        !           543:                        continue;
        !           544:                        }
        !           545:                    break;
        !           546:                    }
        !           547: #ifndef MSDOS
        !           548:                /* User did some input here - check if allowed is restricted */
        !           549:                i = ftell(tfile);
        !           550:                k = 0;
        !           551:                while (fgets(templine, 200, tfile) != NULL) {
        !           552:                    tptr = templine;
        !           553:                    if (*(tptr) == '#') continue;
        !           554:                    /* Level handling */
        !           555:                    if (level && (*tptr == '@')) {
        !           556:                        if ((*(tptr+1)-'0') != level) continue;
        !           557:                        tptr += 2;
        !           558:                        }
        !           559:                    if (*(tptr) != '?') break;
        !           560:                    tchar2 = *(tptr+1);
        !           561:                    if ((tchar2 != '!') && (tchar2 != '@')) continue;
        !           562:                    k = -1;  /* flag that have option list */
        !           563:                    tptr += 2;
        !           564:                    while (*tptr == ' ') tptr++;
        !           565:                    tptr2 = strchr(tptr, '\n');
        !           566:                    if (tptr2 != NULL) *tptr2 = '\0';
        !           567:                    tptr2 = strchr(tptr, '\t');
        !           568:                    if (tptr2 != NULL) *tptr2++ = '\0';
        !           569:                    if (strcmp(ptr, tptr) == 0) {
        !           570:                        k = 1;
        !           571:                        if (tchar2 == '@') k++;
        !           572:                        if (tptr2 != NULL) {
        !           573:                            strcpy(ptr, tptr2);
        !           574:                            if (!argc) printf("Requested: %s\n", ptr);
        !           575:                            }
        !           576:                        break;
        !           577:                        }
        !           578:                    }
        !           579:                
        !           580:                /* see if just jumping a level */
        !           581:                if (k == 2) {
        !           582:                    level++;
        !           583:                    *ptr = '\0';
        !           584:                    continue;
        !           585:                    }
        !           586:                fseek(tfile, (long)i, 0);
        !           587:                if (k < 0) {
        !           588:                    printf("Request must be from those listed. Do a question mark (?) for list\n");
        !           589:                    num++;
        !           590:                    *ptr = '\0';
        !           591:                    continue;
        !           592:                    }
        !           593: #endif  /* Got rid of all this cause DOS rouble */
        !           594:                /* have real result at ptr */
        !           595:                ptr += strlen(ptr);
        !           596:                strcpy(ptr, "\n\t");
        !           597:                ptr += 2;
        !           598:                j++;
        !           599:                if (level) level = 1;
        !           600:                }
        !           601:            if (j > 0) {
        !           602:                if (save_respond && !use_respond) {
        !           603:                    tptr = strchr(eptr, ':');
        !           604:                    if (tptr++ != NULL) {
        !           605:                        while ((*tptr == ' ') || (*tptr == '\t') || (*tptr == '\n')) tptr++;
        !           606:                        put_respond(libptr, filename, query, tptr);
        !           607:                        respond_flag++;
        !           608:                        }
        !           609:                    }
        !           610:                *--ptr = '\0';
        !           611:                eptr += strlen(eptr);
        !           612:                }
        !           613:            else if (j < 0) {
        !           614:                if (eptr != endptr) {
        !           615:                    fprintf(stderr, "Request being entered is removed!\n");
        !           616:                    eptr = endptr;
        !           617:                    j = -5;
        !           618:                    }
        !           619:                break;
        !           620:                }
        !           621:            } /* end of dealing with this form */
        !           622:        /* See if we need to loop */
        !           623:        if (j >= 0) {
        !           624:            if ((eptr == endptr) && !nodata)
        !           625:                fprintf(stderr, "Request without data skipped!\n");
        !           626:            else
        !           627:                numreq++;
        !           628:            if (!multi_req) break;
        !           629:            }
        !           630:        /* If they invoked with arguments, no pause here */
        !           631:        if (used_arg) break;
        !           632:        printf("\nHave entered %d request%s. Enter another (n/y): ",
        !           633:                        numreq, ((numreq != 1) ? "s" : ""));
        !           634:        if (fgets(instr, 80, stdin) == NULL) break;
        !           635:        if ((clptr = strchr(instr, '\n')) != NULL) *clptr = '\0';
        !           636:        if ((*instr != 'y') && (*instr != 'Y')) break;
        !           637:        } /* loop for multiple requests */
        !           638:     *eptr = '\0';
        !           639:     fclose(tfile);
        !           640:     /* output the record */
        !           641:     if (numreq == 0) {
        !           642:        printf("No requests sent!\n");
        !           643:        return;
        !           644:        }
        !           645: #ifdef MSDOS
        !           646:     if ((sendfile = fopen("\\pipe.tmp", "w")) == NULL) {
        !           647: #else
        !           648:     sprintf(instr, "%s %s", Cmd, whereto);
        !           649:     if ((sendfile = popen(instr, "w")) == NULL) {
        !           650: #endif
        !           651:        fprintf(stderr, "Couldn't open mail pipe to send requests! No requests sent\n");
        !           652:        exit(1);
        !           653:        }
        !           654:     fprintf(sendfile, "* *#OPTION2/5-%s\n%s\n%s\n", libcntl, pan, req_name);
        !           655:     fputs(response, sendfile);
        !           656: #ifdef MSDOS
        !           657:     fclose(sendfile);
        !           658:     sprintf(instr, "%s -f \\pipe.tmp -slibRequest %s", Cmd, whereto);
        !           659:     system(instr);
        !           660:     unlink("\\pipe.tmp");
        !           661: #else
        !           662:     pclose(sendfile);
        !           663: #endif
        !           664:     if (logfile != NULL && !nolog) {
        !           665:        ptr = strchr(response, '\n')+1; /* skip send info */
        !           666:        while (ptr != NULL) {
        !           667:            ptr = strchr(ptr, '\n')+1; /* skip **-** line */
        !           668:            if (strlen(ptr) < 5) break;
        !           669:            fprintf(logfile, "From %s %sSubject: option %d request\n",
        !           670:                        req_name, dateptr, optnum);
        !           671:            tptr = ptr;
        !           672:            while ((tptr = strchr(tptr, '\n')) != NULL)
        !           673:                if (strncmp(++tptr, "**-**", 5) == 0) break;
        !           674:            if (tptr != NULL) *tptr++ = '\0';
        !           675:            fputs(ptr, logfile);
        !           676:            fputc('\n', logfile);
        !           677:            ptr = tptr;
        !           678:            }
        !           679:        fclose(logfile);
        !           680:        }
        !           681:     fprintf(stdout, format, numreq);
        !           682:     /* save new responses if any */
        !           683:     if (respond_flag > 1) put_lib_file(libfile, libptr);
        !           684:     return;
        !           685:     }
        !           686: 
        !           687: char *get_lib_file(filename)
        !           688: char *filename;
        !           689:  {
        !           690:     char *ptr, *ptr2;
        !           691:     FILE *file;
        !           692:     struct stat stbuf;
        !           693:     int st_rtn;
        !           694: 
        !           695:     /* get the displays if there are any */
        !           696:     st_rtn = stat(filename, &stbuf); 
        !           697:     if (st_rtn != 0) stbuf.st_size = 10;
        !           698:     ptr = malloc(stbuf.st_size + 2000);
        !           699:     if (ptr == NULL) {
        !           700:        fprintf(stderr, "library: Couldn't get system space for buffer!\n");
        !           701:        exit(1);
        !           702:        }
        !           703:     /* leave emptr char before just to simplify stuff later */
        !           704:     *ptr++ = '\0';
        !           705:     *ptr = '\0';
        !           706:     if (st_rtn) return(ptr);
        !           707:     if ((file = fopen(filename, "r")) == NULL) return(ptr);
        !           708:     ptr2 = ptr;
        !           709:     while (fgets(ptr2, 1000, file) != NULL) 
        !           710:        ptr2 += strlen(ptr2);
        !           711:     *ptr2++ = '\0';
        !           712:     *ptr2 = '\0';
        !           713:     fclose(file);
        !           714:     return(ptr);
        !           715:     }
        !           716: 
        !           717: void put_lib_file(filename, ptr)
        !           718: char *filename;        /* the name of the lib prompt file */
        !           719: char *ptr;
        !           720:  {
        !           721:     FILE *file;
        !           722: 
        !           723:     if ((file = fopen(filename, "w")) != NULL) {
        !           724:        fputs(ptr, file);
        !           725:        fclose(file);
        !           726:        }
        !           727:     return;
        !           728:     }
        !           729: 
        !           730: char *find_respond(ptr, prefix, lookfor)
        !           731: register char *ptr;
        !           732: char *prefix;
        !           733: char *lookfor;
        !           734:  {
        !           735:     static char buf[200];
        !           736:     int len;
        !           737:     char *ptr2;
        !           738: 
        !           739:     /* don't even attempt on long strings */
        !           740:     if ((strlen(prefix)+strlen(lookfor)) >= 200) return(NULL);
        !           741:     sprintf(buf, "%s/%s", prefix, lookfor);
        !           742:     ptr2 = buf + strlen(buf) - 1;
        !           743:     while ((*ptr2 == '\t') || (*ptr2 == '\n') || (*ptr2 == ' ')) ptr2--;
        !           744:     if (*ptr2 != ':') *++ptr2 = ':';
        !           745:     *++ptr2 = '\0';
        !           746:     len = strlen(buf);
        !           747: 
        !           748:     while (*ptr) {
        !           749:        if (!strncmp(ptr, buf, len)) {
        !           750:            ptr += len;  /* point it after the : */
        !           751:            while ((*ptr == ' ') || (*ptr == '\t')) ptr++;
        !           752:            ptr2 = strchr(ptr, '\n');
        !           753:            if (ptr2 != NULL) *ptr2 = '\0';
        !           754:            if (strlen(ptr) > 200) {
        !           755:                if (ptr2 != NULL) *ptr2 = '\n';
        !           756:                return(NULL);
        !           757:                }
        !           758:            strcpy(buf, ptr);
        !           759:            if (ptr2 != NULL) *ptr2 = '\n';
        !           760:            ptr2 = strchr(buf, '\n');
        !           761:            if (ptr2 != NULL) *ptr2 = '\0';
        !           762:            return(buf);
        !           763:            }
        !           764:        ptr = strchr(ptr, '\n');
        !           765:        if (ptr++ == NULL) return(NULL);
        !           766:        }
        !           767:     return(NULL);
        !           768:     }
        !           769: 
        !           770: void put_respond(fullptr, prefix, newstuff, response)
        !           771: register char *fullptr;
        !           772: char *prefix;
        !           773: char *newstuff;
        !           774: char *response;
        !           775:  {
        !           776:     char buf[200];
        !           777:     int len;
        !           778:     register char *ptr2;
        !           779: 
        !           780:     /* don't even attempt on long strings */
        !           781:     if ((strlen(prefix)+strlen(newstuff)) >= 200) return;
        !           782: 
        !           783:     /* remove any existing response */
        !           784:     sprintf(buf, "%s/%s", prefix, newstuff);
        !           785:     ptr2 = buf + strlen(buf) - 1;
        !           786:     while ((*ptr2 == '\t') || (*ptr2 == '\n') || (*ptr2 == ' ')) ptr2--;
        !           787:     if (*ptr2 != ':') *++ptr2 = ':';
        !           788:     *++ptr2 = '\0';
        !           789:     len = strlen(buf);
        !           790: 
        !           791:     while (*fullptr) {
        !           792:        ptr2 = strchr(fullptr, '\n');
        !           793:        if (ptr2 == NULL)
        !           794:                ptr2 = fullptr + strlen(fullptr);
        !           795:        else
        !           796:                ptr2++;
        !           797:        if (!strncmp(fullptr, buf, len)) {
        !           798:            strcpy(fullptr, ptr2);
        !           799:            break;
        !           800:            }
        !           801:        fullptr = ptr2;
        !           802:        }
        !           803:     
        !           804:     fullptr += strlen(fullptr);
        !           805:     if (*(fullptr-1) != '\n') {
        !           806:        *fullptr++ = '\n';
        !           807:        *fullptr = '\0';
        !           808:        }
        !           809:     sprintf(fullptr, "%s %s\n", buf, response);
        !           810:     fullptr = strchr(fullptr, '\n');
        !           811:     if (fullptr != NULL) 
        !           812:        *++fullptr = '\0';
        !           813:     return;
        !           814:     }

unix.superglobalmegacorp.com

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