Annotation of 43BSD/contrib/rcs/src/rcsgen.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *                     RCS revision generation
                      3:  */
                      4:  static char rcsid[]=
                      5:  "$Header: rcsgen.c,v 3.4 86/05/15 02:18:42 lepreau Exp $ Purdue CS";
                      6: /*********************************************************************************
                      7:  *********************************************************************************
                      8:  *
                      9:  * Copyright (C) 1982 by Walter F. Tichy
                     10:  *                       Purdue University
                     11:  *                       Computer Science Department
                     12:  *                       West Lafayette, IN 47907
                     13:  *
                     14:  * All rights reserved. No part of this software may be sold or distributed
                     15:  * in any form or by any means without the prior written permission of the
                     16:  * author.
                     17:  * Report problems and direct all inquiries to Tichy@purdue (ARPA net).
                     18:  */
                     19: 
                     20: 
                     21: /* $Log:       rcsgen.c,v $
                     22:  * Revision 3.4  86/05/15  02:18:42  lepreau
                     23:  * Fix immediate EOF from non-tty files: avoid 0377's in description.
                     24:  * 
                     25:  * Revision 3.3  82/11/28  21:36:49  wft
                     26:  * *** empty log message ***
                     27:  * 
                     28:  * Revision 3.3  82/11/28  21:36:49  wft
                     29:  * Replaced ferror() followed by fclose() with ffclose().
                     30:  * Putdesc() now suppresses the prompts if stdin
                     31:  * is not a terminal. A pointer to the current log message is now
                     32:  * inserted into the corresponding delta, rather than leaving it in a
                     33:  * global variable.
                     34:  * 
                     35:  * Revision 3.2  82/10/18  21:11:26  wft
                     36:  * I added checks for write errors during editing, and improved
                     37:  * the prompt on putdesc().
                     38:  *
                     39:  * Revision 3.1  82/10/13  15:55:09  wft
                     40:  * corrected type of variables assigned to by getc (char --> int)
                     41:  */
                     42: 
                     43: 
                     44: 
                     45: 
                     46: #include "rcsbase.h"
                     47: 
                     48: extern struct hshentry * getnum();
                     49: extern char * mktemp();
                     50: extern FILE * fopen();
                     51: extern savestring();
                     52: extern struct hshentry * genrevs();
                     53: extern editstring();
                     54: 
                     55: extern int nextc;          /* next character from lexical analyzer          */
                     56: extern char * RCSfilename, * workfilename;
                     57: extern struct hshentry * targetdelta; /* delta to be generated              */
                     58: extern char * Ktext;       /* keywords from syntax analyzer                 */
                     59: extern char * Klog;        /* Keyword "log"                                 */
                     60: extern char * Kdesc;       /* Keyword for description                       */
                     61: extern FILE * finptr;      /* RCS input file                                */
                     62: extern FILE * frewrite;    /* new RCS file                                  */
                     63: extern FILE * fcopy;       /* result file during editing                    */
                     64: extern FILE * fedit;       /* edit file                                     */
                     65: extern char * resultfile, *editfile;/* file names for fcopy and fedit       */
                     66: extern int    rewriteflag; /* indicates whether to rewrite the input file   */
                     67: 
                     68: 
                     69: char    curlogmsg[logsize] /* buffer for current log message                */
                     70:         ='\0';
                     71: 
                     72: enum stringwork {copy, edit, expand, edit_expand };
                     73: /* parameter to scandeltatext() */
                     74: 
                     75: 
                     76: 
                     77: 
                     78: char * buildrevision(deltas, target, dir, expandflag)
                     79: struct hshentry ** deltas, * target;
                     80: char * dir; int expandflag;
                     81: /* Function: Generates the revision given by target
                     82:  * by retrieving all deltas given by parameter deltas and combining them.
                     83:  * If dir==nil, the revision is printed on the standard output,
                     84:  * otherwise written into a temporary file in directory dir.
                     85:  * if expandflag==true, keyword expansion is performed.
                     86:  * returns false on errors, the name of the file with the revision otherwise.
                     87:  *
                     88:  * Algorithm: Copy inital revision unchanged. Then edit all revisions but
                     89:  * the last one into it, alternating input and output files (resultfile and
                     90:  * editfile). The last revision is then edited in, performing simultaneous
                     91:  * keyword substitution (this saves one extra pass).
                     92:  * All this simplifies if only one revision needs to be generated,
                     93:  * or no keyword expansion is necessary, or if output goes to stdout.
                     94:  */
                     95: {
                     96:         int i;
                     97: 
                     98:         if (deltas[0]==target) {
                     99:                 /* only latest revision to generate */
                    100:                 if (dir==nil) {/* print directly to stdout */
                    101:                         fcopy=stdout;
                    102:                         scandeltatext(target,expand);
                    103:                         return(char *) true;
                    104:                 } else {
                    105:                         initeditfiles(dir);
                    106:                         scandeltatext(target,expandflag?expand:copy);
                    107:                         ffclose(fcopy);
                    108:                         return(resultfile);
                    109:                 }
                    110:         } else {
                    111:                 /* several revisions to generate */
                    112:                 initeditfiles(dir?dir:"/tmp/");
                    113:                 /* write initial revision into fcopy, no keyword expansion */
                    114:                 scandeltatext(deltas[0],copy);
                    115:                 i = 1;
                    116:                 while (deltas[i+1] != nil) {
                    117:                         /* do all deltas except last one */
                    118:                         scandeltatext(deltas[i++],edit);
                    119:                 }
                    120:                 if (!expandflag) {
                    121:                         /* no keyword expansion; only invoked from ci */
                    122:                         scandeltatext(deltas[i],edit);
                    123:                         finishedit(nil);
                    124:                         ffclose(fcopy);
                    125:                 } else {
                    126:                         /* perform keyword expansion*/
                    127:                         /* first, get to beginning of file*/
                    128:                         finishedit(nil); swapeditfiles(dir==nil);
                    129:                         scandeltatext(deltas[i],edit_expand);
                    130:                         finishedit(deltas[i]);
                    131:                         if (dir!=nil) ffclose(fcopy);
                    132:                 }
                    133:                 return(resultfile); /*doesn't matter for dir==nil*/
                    134:         }
                    135: }
                    136: 
                    137: 
                    138: 
                    139: scandeltatext(delta,func)
                    140: struct hshentry * delta; enum stringwork func;
                    141: /* Function: Scans delta text nodes up to and including the one given
                    142:  * by delta. For the one given by delta, the log message is saved into
                    143:  * curlogmsg and the text is processed according to parameter func.
                    144:  * Assumes the initial lexeme must be read in first.
                    145:  * Does not advance nexttok after it is finished.
                    146:  */
                    147: {       struct hshentry * nextdelta;
                    148: 
                    149:         do {
                    150:                 nextlex();
                    151:                 if (!(nextdelta=getnum())) {
                    152:                         fatserror("Can't find delta for revision %s", delta->num);
                    153:                 }
                    154:                 if (!getkey(Klog) || nexttok!=STRING)
                    155:                         serror("Missing log entry");
                    156:                 elsif (delta==nextdelta) {
                    157:                         savestring(curlogmsg,logsize);
                    158:                         delta->log=curlogmsg;
                    159:                 } else {readstring();
                    160:                         delta->log= "";
                    161:                 }
                    162:                 nextlex();
                    163:                 if (!getkey(Ktext) || nexttok!=STRING)
                    164:                         fatserror("Missing delta text");
                    165: 
                    166:                 if(delta==nextdelta)
                    167:                         /* got the one we're looking for */
                    168:                         switch (func) {
                    169:                         case copy:      copystring();
                    170:                                         break;
                    171:                         case expand:    xpandstring(delta);
                    172:                                         break;
                    173:                         case edit:      editstring(nil);
                    174:                                         break;
                    175:                         case edit_expand: editstring(delta);
                    176:                                         break;
                    177:                         }
                    178:                 else    readstring(); /* skip over it */
                    179: 
                    180:         } while (delta!=nextdelta);
                    181: }
                    182: 
                    183: 
                    184: int putdesc(initflag,textflag,textfile,quietflag)
                    185: int initflag,textflag; char * textfile; int quietflag;
                    186: /* Function: puts the descriptive text into file frewrite.
                    187:  * if !initflag && !textflag, the text is simply copied from finptr.
                    188:  * Otherwise, if the textfile!=nil, the text is read from that
                    189:  * file, or from stdin, if textfile==nil.
                    190:  * if initflag&&quietflag&&!textflag, an empty text is inserted.
                    191:  * if !initflag, the old descriptive text is discarded.
                    192:  * Returns true is successful, false otherwise.
                    193:  */
                    194: {       FILE * txt; register int c, old1, old2;
                    195: 
                    196:         if (!initflag && !textflag) {
                    197:                 /* copy old description */
                    198:                 fprintf(frewrite,"\n\n%s%c",Kdesc,nextc);
                    199:                 rewriteflag=true; getdesc(false);
                    200:                 return true;
                    201:         } else {
                    202:                 /* get new description */
                    203:                if (!initflag) {
                    204:                         /*skip old description*/
                    205:                         rewriteflag=false; getdesc(false);
                    206:                 }
                    207:                 fprintf(frewrite,"\n\n%s\n%c",Kdesc,SDELIM);
                    208:                 if (textfile) {
                    209:                         old1='\n';
                    210:                         /* copy textfile */
                    211:                         if ((txt=fopen(textfile,"r"))!=NULL) {
                    212:                                 while ((c=getc(txt))!=EOF) {
                    213:                                         if (c==SDELIM) putc(c,frewrite); /*double up*/
                    214:                                         putc(c,frewrite);
                    215:                                         old1=c;
                    216:                                 }
                    217:                                 if (old1!='\n') putc('\n',frewrite);
                    218:                                 fclose(txt);
                    219:                                 putc(SDELIM,frewrite);fputs("\n\n", frewrite);
                    220:                                 return true;
                    221:                         } else {
                    222:                                 error("Can't open file with description%s",textfile);
                    223:                         }
                    224:                 }
                    225:                 if (initflag&&quietflag) {
                    226:                         warn("empty descriptive text");
                    227:                         putc(SDELIM,frewrite);fputs("\n\n", frewrite);
                    228:                         return true;
                    229:                 }
                    230:                 /* read text from stdin */
                    231:                 if (isatty(fileno(stdin))) {
                    232:                     fputs("enter description, terminated with ^D or '.':\n",stdout);
                    233:                     fputs("NOTE: This is NOT the log message!\n>> ",stdout);
                    234:                 }
                    235:                 c = '\0'; old2= '\n';
                    236:                 if ((old1=getchar())==EOF) {
                    237:                    if (isatty(fileno(stdin))) {
                    238:                        putc('\n',stdout);
                    239:                        clearerr(stdin);
                    240:                    }
                    241:                }
                    242:                 else for (;;) {
                    243:                             c=getchar();
                    244:                             if (c==EOF) {
                    245:                                     if (isatty(fileno(stdin))) {
                    246:                                        putc('\n',stdout);
                    247:                                        clearerr(stdin);
                    248:                                    }
                    249:                                     putc(old1,frewrite);
                    250:                                     if (old1!='\n') putc('\n',frewrite);
                    251:                                     break;
                    252:                             }
                    253:                             if (c=='\n' && old1=='.' && old2=='\n') {
                    254:                                     break;
                    255:                             }
                    256:                             if (c=='\n' && isatty(fileno(stdin))) fputs(">> ",stdout);
                    257:                             if(old1==SDELIM) putc(old1,frewrite); /* double up*/
                    258:                             putc(old1,frewrite);
                    259:                             old2=old1;
                    260:                             old1=c;
                    261:                     } /* end for */
                    262:                 putc(SDELIM,frewrite);fputs("\n\n",frewrite);
                    263:                 return true;
                    264:         }
                    265: }

unix.superglobalmegacorp.com

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