home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Reference Guide / C-C++ Interactive Reference Guide.iso / c_ref / csource3 / 158_01 / qe11 < prev    next >
Encoding:
Text File  |  1987-10-12  |  7.0 KB  |  346 lines

  1. /*  VERSION 0017  (DATE: 26/03/87)  (TIME: 09:39)  */
  2. /*
  3.     e (qe) screen editor
  4.  
  5.     (C) G. Nigel Gilbert, MICROLOGY, 1981
  6.  
  7.     August-December 1981
  8.     Modified: To QE from e (ver 4.6a) by J.W. Haefner -- Oct 84-Mar 85
  9.  
  10.     FILE: qe11
  11.  
  12.     FUNCTIONS: putvrsn,comntsym,inc_v_num,usstr,has_vrsn,
  13.                 makvrsn,now,putdate,puttime,formatnow,usstr,
  14.                 vrsntail
  15.  
  16.     PURPOSE: put version num and date/time on top of file
  17.  
  18. */
  19.  
  20. #include "qe.h"
  21. #define ESC 0x1b
  22.  
  23. #if VRSNNUM
  24. /* putvrsn -- find and replace version number at top of file */
  25. putvrsn()
  26. {
  27.     int vline,oldcline;
  28.     char *vpos,*numpos,vtext[80];
  29.  
  30.     if (version) {  /*global flag set in ^QK*/
  31.         puttext();
  32.         oldcline=cline;
  33.         if (has_vrsn(&vline,&vpos) == FAIL)  {
  34.             if(makvrsn(vtext)==FAIL) {
  35.                 gettext(oldcline);
  36.                 return FAIL;
  37.             }
  38.         }
  39.         else  {
  40.              numpos=comntsym(text,vpos);
  41.             inc_v_num(text,numpos);
  42. #if VRSNDATE
  43.             if(now()==FAIL) {
  44.                 gettext(oldcline);
  45.                 return FAIL;
  46.             }
  47. #else
  48.             strcpy(date,"00/00/00");
  49.             strcpy(time,"00:00");
  50. #endif
  51.             vrsntail(text);
  52.             altered=YES;
  53.             puttext();
  54.         }
  55.         gettext(oldcline);        /* recover old cline text */
  56.     }
  57.     return YES;
  58. }
  59.  
  60. /*comntsym -- get comment symbols, truncate version line after number*/
  61. /*              return address of beginning of version number */
  62. char *comntsym(v,vpos)
  63. char *v,*vpos;
  64. {
  65.     char *tp,*numpos;
  66.     int len;
  67.  
  68.     comnt[0]=v[0];
  69.     comnt[1]=v[1];
  70.     comnt[3]=v[(len=(strlen(v)-1))];
  71.     comnt[2]=v[(--len)];
  72.     comnt[4]='\0';
  73.     for (tp=vpos;(*tp) && (*tp!=' ');tp++);     /*tp==>1st blnk after "version"*/
  74.     while ((*tp) && ((*tp++) == ' ') );
  75.         /*found nonblank after "VERSION"*/
  76.     numpos=tp-1;
  77.     while((*tp) && ((*tp++) != ' ') );  /*break at next blank*/
  78.     *(--tp)='\0';        /*truncate old version line after numerals*/
  79.     return (numpos);
  80. }
  81.     
  82. /* inc_v_num -- increment the version number */
  83. inc_v_num(v,npos)
  84. char *v,*npos;
  85. {
  86.     char numstr[6];
  87.     int version;
  88.  
  89.     movmem(npos,numstr,4);
  90.     numstr[4]='\0';
  91.     version=qatoi(numstr);
  92.     version++;
  93.     usstr(version,numstr,4);
  94.     numstr[4]='\0';
  95.     movmem(numstr,npos,4);
  96. }
  97.  
  98. /* usstr -- unsigned int to string conversion */
  99. usstr(val,buf,len)
  100. int val;
  101. char *buf;
  102. int len;
  103. {
  104.     int temp,i,bufsz;
  105.  
  106.     /*bufsz=sizeof buf;*/
  107.     bufsz=len;
  108.       /*use memfill()*/
  109.     for (i=0;i<bufsz; buf[i++]='0');        /*fill with leading zeroes*/
  110.     i=bufsz-1;
  111.     while (val>0 && i>=0) {
  112.         buf[i--] = (val%10)+0x30;
  113.         val=val/10;
  114.     }
  115. /*
  116.     do {
  117.         buf[i--] = (val%10)+0x30;
  118.         val=val/10;
  119.     } while (i>=0);
  120. */
  121.     buf[bufsz]='\0';
  122. }
  123.  
  124. /* has_vrsn -- check for existing version number comment */
  125. /*             return FAIL if none, line number and address if found */
  126. int has_vrsn(vline,vpos)
  127. int *vline;
  128. char **vpos;
  129. {
  130.     int pos,line;
  131.  
  132.     line=1;
  133.     pos=-1;
  134.     do {
  135.         gettext(line);
  136.         if (text[0] != '\0')
  137.             pos=index(text,"VERSION");        /*BDS C does not return ptr*/
  138.         line++;
  139.     } while (text[0]=='\0' && line<=lastl);
  140.     *vline=line-1;
  141.     if ((pos > 0) && (pos <= 6)) {  /*ignore other 1st lines with string*/
  142.         *vpos=&(text[pos]);
  143.         /*error("VERSION found");*/
  144.         return YES;
  145.     }
  146.     return FAIL;
  147. }
  148.  
  149. /* makvrsn -- create a version line where none was */
  150. makvrsn(v)
  151. char *v;
  152. {
  153.     char ans[6];
  154.     
  155.     ans[0]='\0';
  156.     if (expert) xprtmess("Left sym (2): ");
  157.     else putmess("Enter left comment symbol (2 digits): ");
  158.     scans(ans,4);
  159.     if(ans[0]== '~') return FAIL;  /*kludge to get ESC*/
  160.     if (!(*ans)) {
  161.          comnt[0]='/';  /*guess this guy is using C*/
  162.         comnt[1]='*';
  163.     }
  164.     else {
  165.         comnt[0]=ans[0];
  166.         comnt[1]=ans[1];
  167.     }
  168.     ans[0]='\0';
  169.     if (expert) xprtmess("Right sym (2): ");
  170.     else putmess("Enter right comment symbol (2 digits): ");
  171.     scans(ans,4);
  172.     if (!(*ans)) {
  173.         comnt[2]='*';
  174.         comnt[3]='/';
  175.     }
  176.     else {
  177.         comnt[2]=ans[0];
  178.         comnt[3]=ans[1];
  179.     }
  180.     comnt[4]='\0';
  181. #if VRSNDATE
  182.     now();
  183. #else
  184.     strcpy(date,"00/00/00");
  185.     strcpy(time,"00:00");
  186. #endif
  187.     v[0]=comnt[0];
  188.     v[1]=comnt[1];
  189.     v[2]='\0';
  190.     strcat(v,"  VERSION 0000");
  191.     vrsntail(v);
  192.       /* put v as first line in editing text */
  193.     inject(0,v);
  194.     return YES;
  195. }
  196.  
  197. /* vrsntail -- put tail on version line */
  198. vrsntail(v)
  199. char *v;
  200. {
  201.     int i;
  202.  
  203.     strcat(v,"  (DATE: ");
  204.     strcat(v,date);
  205.     strcat(v,")  (TIME: ");
  206.     strcat(v,time);
  207.     strcat(v,")");
  208.     /*strcat(v,"\0");*/
  209.     for (i=(strlen(v));i<(VRSNLEN-5);i++) v[i]=' ';
  210.     v[(i++)]=comnt[2];
  211.     v[(i++)]=comnt[3];
  212.     v[(i)]='\0';
  213. }
  214. #endif  /*VRSNNUM*/
  215.  
  216. #if VRSNDATE
  217. /* now -- get time and date from system or user */
  218. now()
  219. {
  220.     char temp[10];
  221.  
  222. #if NOCLOCK        /* no clock, get date and time from user */
  223.     if (date[0]=='\0') formatnow(date,time);   /*get from CP/M page 0 and format*/
  224.     if (expert) xprtmess("Date(da/mn/yr): ");
  225.     else
  226.         putmess("Enter today's date as da/mn/yr (2 digit): ");
  227.     strcpy(temp,date);
  228.     /*puts(temp);*/
  229.     if (*date) {
  230.         inbuf[0]=RETRIEVE;            /*play back current date*/
  231.         if (!inbufp)inbufp=1;
  232.     }
  233.     scans(temp,10);
  234.       /*parse and convert to int*/
  235.     if (temp[8]=='~') return FAIL;    /*bail out */
  236.     if (strcmp(temp,date)!=0) {        /*date has been changed*/
  237.         strcpy(date,temp);
  238.         putdate();
  239.     }
  240.     if (expert) xprtmess("Time(24hr:mn): ");
  241.     else
  242.         putmess("Enter current time as hr:mn (24 hour): ");
  243.     strcpy(temp,time);
  244.     /*puts(temp);*/
  245.     if (*time) {
  246.         inbuf[0]=RETRIEVE;
  247.         if (!inbufp)inbufp=1;
  248.     }
  249.     scans(temp,7);
  250.         /*parse and convert to int*/
  251.     if (strcmp(temp,time)!=0) {        /*time has been changed*/
  252.         strcpy(time,temp);
  253.         puttime();
  254.     }
  255. #else
  256.     /*put code to read and decode system clock here*/
  257. #endif
  258.     return YES;
  259. }
  260.  
  261. /* putdate -- parse date string and store as chars in CP/M page 0*/
  262. putdate()
  263. {
  264.     char temp[4],*nptr;
  265.  
  266.     nptr=NOWLOC;
  267.     temp[0]=date[0];    /*day*/
  268.     temp[1]=date[1];
  269.     temp[2]='\0';
  270.     *nptr++=qatoi(temp);
  271.     temp[0]=date[3];    /*month*/
  272.     temp[1]=date[4];
  273.     temp[2]='\0';
  274.     *nptr++=qatoi(temp);
  275.     temp[0]=date[6];    /*year*/
  276.     temp[1]=date[7];
  277.     temp[2]='\0';
  278.     *nptr=qatoi(temp);
  279. }
  280.  
  281. /* puttime -- parse time string and store as chars in CP/M page 0*/
  282. puttime()
  283. {
  284.     char temp[5],*nptr;
  285.  
  286.     nptr=NOWLOC+3;
  287.     temp[0]=time[0];    /*hour*/
  288.     temp[1]=time[1];
  289.     temp[2]='\0';
  290.     *nptr++=qatoi(temp);
  291.     temp[0]=time[3];    /*minute*/
  292.     temp[1]=time[4];
  293.     temp[2]='\0';
  294.     *nptr=qatoi(temp);
  295. }
  296.  
  297. /* formatnow -- get date and time integers from CP/M page 0, format */
  298. formatnow(d,t)
  299. char *d,*t;
  300. {
  301.       /* read 5 bytes from NOWLOC corresponding to day, month, year,
  302.            hour, minute */
  303.     char *nptr;
  304.     char nstr[3];    /*hold number string */
  305.     char day,month,year,hour,minute;
  306.  
  307.     nptr=NOWLOC;
  308.     day=*nptr++;
  309.     month=*nptr++;
  310.     year=*nptr++;
  311.     hour=*nptr++;
  312.     minute=*nptr;
  313.         /*unsigned short int (char) to string conversion*/
  314.         /*return next address*/
  315.     usstr(day,nstr,2);        /*date first*/
  316.     strcat(d,nstr);
  317.     strcat(d,"/");
  318.     usstr(month,nstr,2);
  319.     strcat(d,nstr);
  320.     strcat(d,"/");
  321.     usstr(year,nstr,2);
  322.     strcat(d,nstr);
  323.         /*now do time*/
  324.     usstr(hour,nstr,2);
  325.     strcat(t,nstr);
  326.     strcat(t,":");
  327.     usstr(minute,nstr,2);
  328.     strcat(t,nstr);
  329. }
  330.  
  331. /* usstr -- convert short int (char) to ascii, store in buf*/
  332. /*
  333. usstr(buf,val)
  334. char *buf;
  335. char val;
  336.  
  337. {
  338.     char tens,ones;
  339.     tens=val/10;
  340.     ones=val - tens*10;
  341.     *buf++=tens+0x30;
  342.     *buf++=ones+0x30;
  343. }
  344. */
  345. #endif  /*VRSNDATE*/
  346. curren