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

1.1     ! root        1: /*     library:option1.c       1.15    */
        !             2: #include "sccsid.h"
        !             3: VERSION(@(#)library:option1.c  1.15)
        !             4: 
        !             5: /******************  option1.c  *****************************/
        !             6: 
        !             7: /* This routine accepts requests for documents known by number.
        !             8:  * This includes:
        !             9:  *      TMs, SLs (and variants - GLs, ILs, etc), DLs, DSs,
        !            10:  *      technical reports, ctp items.
        !            11:  *
        !            12:  * In addition it includes two special classes of items:
        !            13:  *
        !            14:  *     Memos kept by date (or switching case numbers). For these this
        !            15:  *     routine also prompts for the following info:
        !            16:  *             title
        !            17:  *             author: - this author is looked up for location of memos
        !            18:  *
        !            19:  *     Table of content items known by short number which has the form
        !            20:  *                     <letter><3 digits><optional letter>
        !            21:  *
        !            22:  *     For these this routine also prompts for a page number.
        !            23:  */
        !            24: 
        !            25: #include <stdio.h>
        !            26: #include <ctype.h>
        !            27: #include <signal.h>
        !            28: char *malloc(), *realloc();
        !            29: 
        !            30: option1(logfile, argc, argv)
        !            31: FILE *logfile;
        !            32: int argc;
        !            33: char *argv[];
        !            34: {  
        !            35:     int i, numreq=0;
        !            36:     extern char *Cmd, *whereto, libcntl[], pan[], req_name[];
        !            37:     long day, resp_size;
        !            38:     char instr[512], done_flag=0, parm_flag=0, err_flag=0,
        !            39:            *dateptr, *ctime(), multi_flag, itemline[1000];
        !            40:     register char *ptr;
        !            41:     char  docid[256], *strptr, *tptr, *strchr();
        !            42:     char *response;    /* this is the buffer where requests go */
        !            43:     int can_remark;    /* flag to say whether remarks with this request */
        !            44:     char *endptr, *eptr;
        !            45:     FILE *fopen(), *helpfile, *popen(), *sendfile;
        !            46: 
        !            47:     /* get the date - note used only in the log */
        !            48:     time(&day);
        !            49:     dateptr = ctime(&day);
        !            50:     /* get initial buffer for requests  */
        !            51:     resp_size = 5000;
        !            52:     if ((response = malloc(resp_size)) == NULL) {
        !            53:        fprintf(stderr, "library: Couldn't get space for request (%d). No requests sent!\n", resp_size);
        !            54:        exit(1);
        !            55:        }
        !            56:     *response = '\0';
        !            57: 
        !            58:     /* special handling in the case of parameters passed */
        !            59:     if (argc) {
        !            60:        parm_flag = 1;
        !            61:        *itemline = '\0';
        !            62:        for (i=0; i<argc; i++) {
        !            63:            if (*itemline) strcat(itemline, " ");
        !            64:            strcat(itemline, argv[i]);
        !            65:            }
        !            66:        }
        !            67: 
        !            68:     eptr = response;
        !            69:     while (!done_flag) {  /* loop until break when the user types . <return>  */
        !            70:        /* check if getting low on space */
        !            71:        if ((resp_size - strlen(response)) < 500) {
        !            72:            resp_size += 5000;
        !            73:            ptr = response;
        !            74:            if ((response = realloc(response, resp_size)) == NULL) {
        !            75:                fprintf(stderr, "library: Couldn't get space for this much request (%d). No requests sent!\n", resp_size);
        !            76:                exit(1);
        !            77:                }
        !            78:            eptr += (response - ptr);
        !            79:            }
        !            80:        /* now ready to get document id */
        !            81:        if (err_flag || !parm_flag) {
        !            82:            printf("\nEnter item identifier(s) (. to exit):");
        !            83:            if (fgets(itemline, 1000, stdin) == NULL) break;
        !            84:            if (*itemline == '.') break;
        !            85:            if ((tptr = strchr(itemline, '\n')) != NULL) *tptr = '\0';
        !            86:            if (!strcmp(itemline, "exit") || !strcmp(itemline, "quit")) break;
        !            87:            if (strlen(itemline) == 0) {
        !            88:                printf("Please enter IDs of items requested. ? for help.\n");
        !            89:                continue;
        !            90:                }
        !            91:            }
        !            92:        if (*itemline == '~') {
        !            93:            fprintf(stderr, "Tilde escape do not work in option 1! Please reeenter requests\n");
        !            94:            continue;
        !            95:            }
        !            96:        uppercase(itemline);
        !            97:        /* check if help is desired */
        !            98:        if ((strlen(itemline) == 1) && ((*itemline=='?')||(*itemline=='H')) ) {
        !            99:            sprintf(itemline, "%s/known.list", WHERE);
        !           100:            if ((helpfile = fopen(itemline, "r")) == NULL) {
        !           101:                printf("Sorry. Help statement unavailable!\n");
        !           102:                continue;
        !           103:                }
        !           104:            while (fgets(itemline, BUFSIZ, helpfile) != NULL)
        !           105:                if (*itemline == '?') printf("%s", itemline+1);
        !           106:            fclose(helpfile);
        !           107:            continue;
        !           108:            }
        !           109: 
        !           110:        /* remove trailing blanks */
        !           111:        ptr = itemline + strlen(itemline) - 1;
        !           112:        while ( (*ptr == ' ')  || (*ptr == '\t') )
        !           113:                    ptr--;
        !           114:        *++ptr = '\0';
        !           115: 
        !           116:        /* now break apart the input string to get ids */
        !           117:        strptr = itemline;
        !           118:        multi_flag = err_flag = 0;
        !           119:        while ((strptr != NULL) && (strlen(strptr) > 0) ) {
        !           120:            /* Find start of the string */
        !           121:            ptr = strptr;
        !           122:            while (*ptr && (*ptr == ' ' || *ptr == '\t') ) ptr++;
        !           123:            if (*ptr == '\0') break;
        !           124: 
        !           125:            /* find the end of this id - can be tricky */
        !           126:            endptr = strchr(ptr, ' ');
        !           127:            /* ptr is pointing to the id  */
        !           128:            if (endptr != NULL)
        !           129:                *endptr++ = '\0';
        !           130:            strptr = endptr;
        !           131:            strcpy(docid, ptr);
        !           132: 
        !           133:            if (strlen(docid) > 70) {
        !           134:                printf("Document id %s too long. Reenter\n", docid);
        !           135:                err_flag = 1;
        !           136:                continue;
        !           137:                }
        !           138: 
        !           139:            /* we need to know if there is more than one i|em on this line */
        !           140:            if ( (strptr != NULL) && (*strptr != '\0') ) multi_flag = 1;
        !           141: 
        !           142:            if ((can_remark = checkdoc(docid)) < 0) {
        !           143:                /* error in id */
        !           144:                err_flag = 1;
        !           145:                printf("Incorrect id %s given\n", docid);
        !           146:                continue;
        !           147:                }
        !           148:            
        !           149:            /* Check in the logfile to see if this has been ordered */
        !           150:            if (logfile != NULL) {
        !           151:                rewind(logfile);
        !           152:                i = strlen(docid);
        !           153:                while (fgets(eptr, 100, logfile) != NULL) 
        !           154:                    if (!strncmp(eptr, docid, i) && (*(eptr+i) == '\n')) {
        !           155:                        /* Make sure pointer at end, for write later */
        !           156:                        fseek(logfile, 0L, 2);
        !           157:                        printf("Document ID %s already exists in your log file.\n", docid);
        !           158:                        printf("Do you wish to request it again (type y if yes): ");
        !           159:                        if ((fgets(eptr, 100, stdin) == NULL) || ((*eptr != 'y') && (*eptr != 'Y')) )
        !           160:                                i = 0;
        !           161:                        break;
        !           162:                        } /* end deling with already ordered */
        !           163:                if (!i) continue; /* i is flag, only reorder if set to 0 */
        !           164:                } /* end of check in logfile */
        !           165: 
        !           166:            sprintf(eptr, "**-**\n%s\n", docid);
        !           167:            eptr += strlen(eptr);
        !           168:            if (can_remark && !parm_flag && !multi_flag) {
        !           169:                printf("Enter any additional remarks. End with a blank line.\n*");
        !           170:                while (strlen(fgets(eptr, 200, stdin)) > 1) {
        !           171:                    if (*eptr == '.') {
        !           172:                        *eptr = '\0';
        !           173:                        done_flag = 1;
        !           174:                        break;
        !           175:                        }
        !           176:                    printf("*");
        !           177:                    eptr += strlen(eptr);
        !           178:                    }
        !           179:                } /* end of remark getting */
        !           180: 
        !           181:            /* if first put on header */
        !           182:            numreq++;
        !           183:            } /* end of parts of entered string handling loop */
        !           184:        if (parm_flag && !err_flag) break;
        !           185:        } /* end of main request getting loop */
        !           186: 
        !           187:     /* output the record */
        !           188:     signal(SIGINT, SIG_IGN);
        !           189:     if (numreq == 0) {
        !           190:        printf("No requests sent!\n");
        !           191:        return;
        !           192:        }
        !           193: #ifdef MSDOS
        !           194:     if ((sendfile = fopen("\\pipe.tmp", "w")) == NULL) {
        !           195: #else
        !           196:     sprintf(instr, "%s %s", Cmd, whereto);
        !           197:     if ((sendfile = popen(instr, "w")) == NULL) {
        !           198: #endif
        !           199:        fprintf(stderr, "Couldn't open mail pipe to send requests! No requests sent\n");
        !           200:        exit(1);
        !           201:        }
        !           202:     fprintf(sendfile, "* *#KNOWN-%s\n%s\n%s\n", libcntl, pan, req_name);
        !           203:     fputs(response, sendfile);
        !           204: #ifdef MSDOS
        !           205:     fclose(sendfile);
        !           206:     sprintf(instr, "%s -f \\pipe.tmp -slibRequest %s", Cmd, whereto);
        !           207:     system(instr);
        !           208:     unlink("\\pipe.tmp");
        !           209: #else
        !           210:     pclose(sendfile);
        !           211: #endif
        !           212:     if (logfile != NULL) {
        !           213:        ptr = response;
        !           214:        while (ptr != NULL) {
        !           215:            ptr = strchr(ptr, '\n')+1; /* skip **-** line */
        !           216:            if (strlen(ptr) < 5) break;
        !           217:            fprintf(logfile, "From %s %sSubject: option 1 request\n",
        !           218:                        req_name, dateptr);
        !           219:            tptr = ptr;
        !           220:            while ((tptr = strchr(tptr, '\n')) != NULL)
        !           221:                if (strncmp(++tptr, "**-**", 5) == 0) break;
        !           222:            if (tptr != NULL) *tptr++ = '\0';
        !           223:            fputs(ptr, logfile);
        !           224:            fputc('\n', logfile);
        !           225:            ptr = tptr;
        !           226:            }
        !           227:        fclose(logfile);
        !           228:        }
        !           229:     if (numreq == 1)
        !           230:        fprintf(stdout, "Your request has been sent\n");
        !           231:     else
        !           232:        fprintf(stdout, "Your %d requests have been sent\n", numreq);
        !           233:     return;
        !           234:     }
        !           235: 

unix.superglobalmegacorp.com

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