home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OS9000 / APPS / rcs.lzh / rcs1 / rcsgen.a < prev    next >
Text File  |  1996-04-20  |  31KB  |  1,244 lines

  1.  psect rcsgen_c,0,0,0,0,0
  2.  nam rcsgen_c
  3. * /*
  4. * #ifndef lint
  5. * static char rcsid[]= "$Id: rcsgen.c_v 1.2 96/04/07 00:23:11 hiro Exp $ Purdue CS";
  6.  vsect
  7. rcsid  dc.b "$Id: rcsgen.c_v 1.2 96/04/07 00:23:11 hiro Exp $ Purdue CS",$0
  8.  ends
  9. * #endif
  10. * /* Copyright (C) 1982, 1988, 1989 Walter Tichy
  11. * /* $Log:    rcsgen.c_v $
  12. * #include "rcsbase.h"
  13. * /*
  14. * #define RCSBASE "$Id: rcsbase.h_v 1.2 96/04/07 00:17:24 hiro Exp $"
  15. * /* Copyright (C) 1982, 1988, 1989 Walter Tichy
  16. * /*****************************************************************************
  17. * /* $Log:    rcsbase.h_v $
  18. * #if defined(_OS9000) && !defined(OSK)
  19. * #define OSK    1
  20. * #endif
  21. * #include <stdio.h>
  22. * /* type lengths regardless of compiler in use:
  23. * typedef short WORD;     /* always 16 bits */
  24. * #ifdef OSK
  25. * #   define BUFSIZ 512
  26. * #   define _NFILE 32
  27. * #else
  28. * #   ifdef OS9
  29. * #       define BUFSIZ 256
  30. * #       define _NFILE 16
  31. * #   endif
  32. * #endif
  33. * typedef struct _iobuf {
  34. *     char *_ptr,        /* buffer pointer */
  35. *          *_base,    /* buffer base address */
  36. *          *_end;        /* buffer end address */
  37. *     WORD _flag;        /* file status */
  38. *     WORD _fd;        /* file path number */
  39. *     char _save;        /* for 'ungetc' when unbuffered */
  40. *     WORD _bufsiz;    /* size of data buffer */
  41. *     int (*_ifunc)();/* function to use for input */
  42. *     int (*_ofunc)();/* function to use for output */
  43. * } FILE;
  44. * extern FILE _iob[_NFILE];
  45. * /*    the following are fake pointer variable defintions  */
  46. * #define stdin    (&_iob[0])
  47. * #define stdout    (&_iob[1])
  48. * #define stderr    (&_iob[2])
  49. * #define _READ        1
  50. * #define _WRITE        2
  51. * #define _UNBUF        4
  52. * #define _BIGBUF        8
  53. * #define _EOF        0x10
  54. * #define _ERR        0x20
  55. * #define _SCF        0x40
  56. * #define _RBF        0x80
  57. * #define _DEVMASK    0xc0
  58. * #define _WRITTEN    0x0100        /*    buffer written in update mode  */
  59. * #define _MYBUF        0x0200        /*    system allocated buffer  */
  60. * #define _INIT        0x8000        /*    _iob initialized  */
  61. * #define EOF (-1)
  62. * #define EOL 13
  63. * #define NULL 0
  64. * #ifdef OSK
  65. * #define PMODE READ|WRITE    /* r/w for owner */
  66. * #else
  67. * #define PMODE  0xb          /* r/w for owner, r for others */
  68. * #endif
  69. * #define fgetc           getc
  70. * #define putchar(c)      putc(c,stdout)
  71. * #define getchar()       getc(stdin)
  72. * #define ferror(p)       ((p)->_flag&_ERR)
  73. * #define feof(p)         ((p)->_flag&_EOF)
  74. * #define clearerr(p)     ((p)->_flag&=~_ERR)
  75. * #define cleareof(p)     ((p)->_flag&=~_EOF)
  76. * #define fileno(p)       ((p)->_fd)
  77. * extern FILE *fopen(), *fdopen(), *freopen();
  78. * extern char *fgets(), *gets();
  79. * extern long ftell();
  80. * #ifdef USG
  81. * #include <string.h>
  82. * #else
  83. * #include <strings.h>
  84. * /*
  85. * extern char *strcat(),*strncat(),*strcpy();
  86. * extern char *strncpy(),*index(),*rindex();
  87. * extern int strcmp(),strncmp(),strlen();
  88. * #endif
  89. * #ifndef OSK
  90. * #undef putc         /* will be redefined */
  91. * #endif
  92. * #ifndef    cleareof
  93. * #define    cleareof(s)    _cleareof(s)
  94. * #endif
  95. * #ifndef    clearerr
  96. * #define    clearerr(s)    _clearerr(s)
  97. * #endif
  98. * #ifndef    fileno
  99. * #define    fileno(s)    _fileno(s)
  100. * #endif
  101. * #ifndef    EOS_SHARE
  102. * #define    EOS_SHARE    E_SHARE
  103. * #endif
  104. * #if defined(_UCC) || defined(_OS9000)
  105. * #define    environ        _environ
  106. * #endif
  107. * #ifdef USG
  108. * #       define rindex    strrchr
  109. * #       define DATEFORM  "%.2d.%.2d.%.2d.%.2d.%.2d.%.2d"
  110. * #else
  111. * #       define DATEFORM  "%02d.%02d.%02d.%02d.%02d.%02d"
  112. * #endif
  113. * /* Make sure one of %02d or %.2d prints a number with a field width 2, with
  114. * #define PRINTDATE(file,date) fprintf(file,"%.2s/%.2s/%.2s",date,date+3,date+6)
  115. * #define PRINTTIME(file,date) fprintf(file,"%.2s:%.2s:%.2s",date+9,date+12,date+15)
  116. * /* print RCS format date and time in nice format from a string              */
  117. * /*
  118. * #define BYTESIZ             8 /* number of bits in a byte                   */
  119. * /*#define STRICT_LOCKING    0 /* 0 sets the default locking to non-strict;  */
  120. *                               /* used in experimental environments.         */
  121. *                               /* 1 sets the default locking to strict;      */
  122. *                               /* used in production environments.           */
  123. *                   /* STRICT_LOCKING is set in the Makefile!     */
  124. * #ifndef hshsize
  125. * #define hshsize           239 /* hashtable size; MUST be prime and -1 mod 4 */
  126. *                               /* other choices: 547 or 719                  */
  127. * #endif
  128. * #define strtsize (hshsize * 50) /* string table size                        */
  129. * #ifdef SMALLOG
  130. * #  define logsize         1024 /* max. size of log message for pdp11        */
  131. * #else
  132. * #  define logsize         4096 /* max. size of log message for others       */
  133. * #endif
  134. * #define revlength          30 /* max. length of revision numbers            */
  135. * #define datelength         20 /* length of a date in RCS format             */
  136. * #define joinlength         20 /* number of joined revisions permitted       */
  137. * #ifdef MSDOS        /* Added by $Author: hiro $ */
  138. * #define RCSDIR         "RCS\\" /* subdirectory for RCS files                 */
  139. * #else
  140. * #define RCSDIR         "RCS/" /* subdirectory for RCS files                 */
  141. * #endif /* MSDOS */
  142. * #ifdef MSDOS        /* Added by $Author: hiro $ */
  143. * #define RCSSUF            '\0' /* suffix for RCS files                       */
  144. * #define RCSSEP            '\0' /* separator for RCSSUF                       */
  145. * #else
  146. * #ifdef OSK
  147. * #define RCSSUF              'v' /* suffix for RCS files                        */
  148. * #define RCSSEP              '_' /* separator for RCSSUF                        */
  149. * #else
  150. * #define RCSSUF            'v' /* suffix for RCS files                       */
  151. * #define RCSSEP            ',' /* separator for RCSSUF                       */
  152. * #endif /* OSK */
  153. * #endif /* MSDOS */
  154. * #define KDELIM            '$' /* delimiter for keywords                     */
  155. * #define VDELIM            ':' /* separates keywords from values             */
  156. * #define DEFAULTSTATE    "Exp" /* default state of revisions                 */
  157. * #ifdef V4_2BSD
  158. * #  define NCPFN           256 /* number of characters per filename          */
  159. * #  define NCPPN          1024 /* number of characters per pathname          */
  160. * #else
  161. * #ifdef MSDOS        /* Added by $Author: hiro $ */
  162. * #  define NCPFN            13 /* number of characters per filename          */
  163. * #  define NCPPN              66 /* number of characters per pathname          */
  164. * #else
  165. * #ifdef OSK
  166. * #  define NCPFN               28 /* number of characters per filename            */
  167. * #  define NCPPN          6*NCPFN /* number of characters per pathname            */
  168. * #else
  169. * #  define NCPFN            14 /* number of characters per filename          */
  170. * #  define NCPPN       6*NCPFN /* number of characters per pathname          */
  171. * #endif /* OSK */
  172. * #endif /* MSDOS */
  173. * #endif
  174. * #define keylength          20 /* buffer length for expansion keywords       */
  175. * #define keyvallength NCPPN+revlength+datelength+60
  176. *                               /* buffer length for keyword expansion        */
  177. * #define true     1
  178. * #define false    0
  179. * #define nil      0
  180. * #define elsif    else if
  181. * #define elif     else if
  182. * /* temporary file names */
  183. * #ifdef MSDOS            /* Added by $Author: hiro $ */
  184. * #define NEWRCSFILE  "nwXXXXXX"
  185. * #define DIFFILE     "ciXXXXXX"
  186. * #define TMPFILE1    "t1XXXXXX"
  187. * #define TMPFILE2    "t2XXXXXX"
  188. * #define TMPFILE3    "t3XXXXXX"
  189. * #define JOINFIL2    "j2XXXXXX"
  190. * #define JOINFIL3    "j3XXXXXX"
  191. * #else
  192. * #ifdef OSK
  193. * #define NEWRCSFILE  "_RCSnewXXXXXX"
  194. * #define DIFFILE     "_RCSciXXXXXX"
  195. * #define TMPFILE1    "_RCSt1XXXXXX"
  196. * #define TMPFILE2    "_RCSt2XXXXXX"
  197. * #define TMPFILE3    "_RCSt3XXXXXX"
  198. * #define JOINFIL2    "_RCSj2XXXXXX"
  199. * #define JOINFIL3    "_RCSj3XXXXXX"
  200. * #else
  201. * #define NEWRCSFILE  ",RCSnewXXXXXX"
  202. * #define DIFFILE     ",RCSciXXXXXX"
  203. * #define TMPFILE1    ",RCSt1XXXXXX"
  204. * #define TMPFILE2    ",RCSt2XXXXXX"
  205. * #define TMPFILE3    ",RCSt3XXXXXX"
  206. * #define JOINFIL2    ",RCSj2XXXXXX"
  207. * #define JOINFIL3    ",RCSj3XXXXXX"
  208. * #endif /* OSK */
  209. * #endif /* MSDOS */
  210. * #ifndef OSK
  211. * #define putc(x,p) (--(p)->_cnt>=0? ((int)(*(p)->_ptr++=(unsigned)(x))):fflsbuf((unsigned)(x),p))
  212. * /* This version of putc prints a char, but aborts on write error            */
  213. * #endif
  214. * #define GETC(in,out,echo) (c=getc(in), echo?putc(c,out):c)
  215. * /* GETC modifies a local variable c; a kludge, but smaller and faster.      */
  216. * /* GETC writes a del-character (octal 177) on end of file                   */
  217. * #ifdef MSDOS
  218. * #define WORKMODE(RCSmode) (RCSmode & ~S_IWRITE)|((lockflag||!StrictLocks)? ( S_IWRITE | S_IREAD ) : 0000 )
  219. * #else
  220. * #ifdef OSK
  221. * #ifdef _OS9000
  222. * #define WORKMODE(RCSmode) ( RCSmode&~(S_IWRITE|S_IGWRITE|S_IOWRITE)) | ( (lockflag||!StrictLocks) ? S_IWRITE|S_IREAD : 0 )
  223. * #else
  224. * #define WORKMODE(RCSmode) ( RCSmode&~0x12) | ( (lockflag||!StrictLocks) ? 0x02 : 0 )
  225. * #endif
  226. * #else
  227. * #define WORKMODE(RCSmode) (RCSmode&~0222)|((lockflag||!StrictLocks)?0600:0000)
  228. * #endif
  229. * #endif /* MSDOS */
  230. * /* computes mode of working file: same as RCSmode, but write permission     */
  231. * /* determined by lockflag and StrictLocks.                                  */
  232. * /* character classes and token codes */
  233. * enum tokens {
  234. * /* char classes*/  DIGIT, IDCHAR, NEWLN, LETTER, PERIOD, SBEGIN, SPACE, UNKN,
  235. * /* tokens */       COLON, DATE, EOFILE, ID, KEYW, NUM, SEMI, STRING,
  236. * };
  237. * #define AT      SBEGIN  /* class SBEGIN (string begin) is returned by lex. anal. */
  238. * #define SDELIM  '@'     /* the actual character is needed for string handling*/
  239. * /* these must be changed consistently, for instance to:
  240. * /* other characters */
  241. * #define ACCENT   IDCHAR
  242. * #define AMPER    IDCHAR
  243. * #define BACKSL   IDCHAR
  244. * #define BAR      IDCHAR
  245. * #define COMMA    UNKN
  246. * #define DIVIDE   IDCHAR
  247. * #define DOLLAR   UNKN                /* overlap with KDELIM */
  248. * #define DQUOTE   IDCHAR
  249. * #define EQUAL    IDCHAR
  250. * #define EXCLA    IDCHAR
  251. * #define GREAT    IDCHAR
  252. * #define HASH     IDCHAR
  253. * #define INSERT   UNKN
  254. * #define LBRACE   IDCHAR
  255. * #define LBRACK   IDCHAR
  256. * #define LESS     IDCHAR
  257. * #define LPARN    IDCHAR
  258. * #define MINUS    IDCHAR
  259. * #define PERCNT   IDCHAR
  260. * #define PLUS     IDCHAR
  261. * #define QUEST    IDCHAR
  262. * #define RBRACE   IDCHAR
  263. * #define RBRACK   IDCHAR
  264. * #define RPARN    IDCHAR
  265. * #define SQUOTE   IDCHAR
  266. * #define TILDE    IDCHAR
  267. * #define TIMES    IDCHAR
  268. * #define UNDER    IDCHAR
  269. * #define UPARR    IDCHAR
  270. * /***************************************
  271. * /* Hash table entry */
  272. * struct hshentry {
  273. *         char              * num;      /* pointer to revision number (ASCIZ) */
  274. *         char              * date;     /* pointer to date of checking        */
  275. *         char              * author;   /* login of person checking in        */
  276. *         char              * lockedby; /* who locks the revision             */
  277. *         char              * log;      /* log message requested at checkin   */
  278. *         char              * state;    /* state of revision (Exp by default) */
  279. *         struct branchhead * branches; /* list of first revisions on branches*/
  280. *         struct hshentry   * next;     /* next revision on same branch       */
  281. *         int                 insertlns;/* lines inserted (computed by rlog)  */
  282. *         int                 deletelns;/* lines deleted  (computed by rlog)  */
  283. *         char                selector; /* marks entry for selection/deletion */
  284. * };
  285. * /* list element for branch lists */
  286. * struct branchhead {
  287. *         struct hshentry   * hsh;
  288. *         struct branchhead * nextbranch;
  289. * };
  290. * /* accesslist element */
  291. * struct access {
  292. *         char              * login;
  293. *         struct access     * nextaccess;
  294. * };
  295. * /* list element for locks  */
  296. * struct lock {
  297. *         char              * login;
  298. *         struct hshentry   * delta;
  299. *         struct lock       * nextlock;
  300. * };
  301. * /* list element for symbolic names */
  302. * struct assoc {
  303. *         char              * symbol;
  304. *         struct hshentry   * delta;
  305. *         struct assoc      * nextassoc;
  306. * };
  307. * /* common variables (getadmin and getdelta())*/
  308. * extern char            * Comment;
  309. * extern struct access   * AccessList;
  310. * extern struct assoc    * Symbols;
  311. * extern struct lock     * Locks;
  312. * extern struct hshentry * Head;
  313. * extern struct hshentry * Dbranch;
  314. * extern int               StrictLocks;
  315. * extern int               TotalDeltas;
  316. * #ifndef lint
  317. * static char copyright[]="Copyright (C) 1982 by Walter F. Tichy";
  318.  vsect
  319. copyright  dc.b "Copyright (C) 1982 by Walter F. Tichy",$0
  320.  ends
  321. * #endif
  322. * /* common variables (lexical analyzer)*/
  323. * extern enum tokens map[];
  324. * #define ctab (&map[1])
  325. * extern enum tokens       nexttok;
  326. * extern int               hshenter;
  327. * extern char            * NextString;
  328. * extern char            * cmdid;
  329. * #if defined(USG) || defined(V4_2BSD)
  330. * #define VOID    (void)
  331. * #else
  332. * #ifndef OSK
  333. * typedef int void;
  334. * #endif
  335. * #define VOID
  336. * #endif
  337. * /* common routines */
  338. * extern char *talloc();
  339. * extern int serror();
  340. * extern int faterror();
  341. * extern int fatserror();
  342. * extern void ignoreints();
  343. * extern void catchints();
  344. * extern void restoreints();
  345. * #ifdef USG
  346. * extern int sprintf();
  347. * #endif
  348. * /*
  349. * #define AUTHOR          "Author"
  350. * #define DATE            "Date"
  351. * #define HEADER          "Header"
  352. * #define IDH             "Id"
  353. * #define LOCKER          "Locker"
  354. * #define LOG             "Log"
  355. * #define RCSFILE         "RCSfile"
  356. * #define REVISION        "Revision"
  357. * #define SOURCE          "Source"
  358. * #define STATE           "State"
  359. * enum markers { Nomatch, Author, Date, Header, Id,
  360. *            Locker, Log, RCSfile, Revision, Source, State };
  361. * #define DELNUMFORM      "\n\n%s\n%s\n"
  362. * /* used by putdtext and scanlogtext */
  363. * #define DELETE          'D'
  364. * /* set by rcs -o and used by puttree() in rcssyn */
  365. * extern struct hshentry * getnum();
  366. * extern FILE * fopen();
  367. * extern savestring();
  368. * extern editstring();
  369. * extern int nextc;          /* next character from lexical analyzer          */
  370. * extern char Ktext[];       /* keywords from syntax analyzer                 */
  371. * extern char Klog[];        /* Keyword "log"                                 */
  372. * extern char Kdesc[];       /* Keyword for description                       */
  373. * extern FILE * frewrite;    /* new RCS file                                  */
  374. * extern FILE * fcopy;       /* result file during editing                    */
  375. * extern char * resultfile;  /* file name for fcopy                           */
  376. * extern int    rewriteflag; /* indicates whether to rewrite the input file   */
  377. * #if defined(MSDOS) || defined(OSK)
  378. * extern char tmpdir[NCPPN];
  379. * #endif /* MSDOS */
  380. * char    curlogmsg[logsize]; /* buffer for current log message                */
  381.  vsect
  382. curlogmsg: ds.b 4096
  383. * enum stringwork {copy, edit, expand, edit_expand };
  384. * /* parameter to scandeltatext() */
  385. * char * buildrevision(deltas, target, dir, expandflag)
  386. * struct hshentry ** deltas, * target;
  387.  ends
  388. * char * dir; int expandflag;
  389. * /* Function: Generates the revision given by target
  390. * {
  391.  ttl buildrev
  392. buildrevision:  link a5,#0
  393.  movem.l #_1!3,-(sp)
  394.  move.l #_3,d0 :6
  395.  bsr _stkcheck
  396. *         int i;
  397. *         if (deltas[0]==target) {
  398.  subq.l #4,sp :2
  399.  movea.l 4(sp),a0
  400.  move.l 8(sp),d0
  401.  cmp.l (a0),d0 :2
  402.  bne _6
  403. _5
  404. *                 /* only latest revision to generate */
  405. *                 if (dir==nil) {/* print directly to stdout */
  406.  tst.l 4+_2(sp)
  407.  bne _8
  408. _7
  409. *                         fcopy=stdout;
  410. *                         scandeltatext(target,expand);
  411. *                         return(char *) true;
  412.  lea _iob+28(a6),a0
  413.  move.l a0,fcopy(a6)
  414.  moveq.l #2,d1 :2
  415.  move.l 8(sp),d0
  416.  bsr scandeltatext
  417.  moveq.l #1,d0 :2
  418.  addq.l #4,sp :2
  419.  bra _4
  420. *                 } else {
  421.  bra _9
  422. _8
  423. *                         initeditfiles(dir);
  424. *                         scandeltatext(target,expandflag?expand:copy);
  425. *                         ffclose(fcopy);
  426. *                         return(resultfile);
  427.  move.l 4+_2(sp),d0
  428.  bsr initeditfiles
  429.  tst.l 8+_2(sp)
  430.  beq _10
  431. _11
  432.  moveq.l #2,d0 :2
  433.  bra _12
  434. _10
  435.  moveq.l #0,d0 :2
  436. _12
  437.  move.l d0,d1 :2
  438.  move.l 8(sp),d0
  439.  bsr scandeltatext
  440.  move.l fcopy(a6),d0
  441.  bsr ffclose
  442.  move.l resultfile(a6),d0
  443.  addq.l #4,sp :2
  444.  bra _4
  445. *                 }
  446. *         } else {
  447. _9
  448.  bra _13
  449. _6
  450. *                 /* several revisions to generate */
  451. * #if defined(MSDOS) || defined(OSK)
  452. *                 initeditfiles(dir?dir: tmpdir);
  453. * #else
  454. *                 initeditfiles(dir?dir:"/tmp/");
  455. * #endif /* MSDOS */
  456. *                 /* write initial revision into fcopy, no keyword expansion */
  457. *                 scandeltatext(deltas[0],copy);
  458. *                 i = 1;
  459. *                 while (deltas[i+1] != nil) {
  460.  tst.l 4+_2(sp)
  461.  beq _14
  462. _15
  463.  movea.l 4+_2(sp),a0
  464.  bra _16
  465. _14
  466.  lea tmpdir(a6),a0
  467. _16
  468.  move.l a0,d0 :2
  469.  bsr initeditfiles
  470.  moveq.l #0,d1 :2
  471.  movea.l 4(sp),a0
  472.  move.l (a0),d0 :2
  473.  bsr scandeltatext
  474.  moveq.l #1,d0 :2
  475.  move.l d0,(sp) :2
  476.  bra _18
  477. _19
  478. *                         /* do all deltas except last one */
  479. *                         scandeltatext(deltas[i++],edit);
  480. *                 }
  481.  moveq.l #1,d1 :2
  482.  move.l (sp),d0 :2
  483.  addq.l #1,(sp) :2
  484.  lsl.l #2,d0 :2
  485.  movea.l 4(sp),a0
  486.  move.l 0(a0,d0.l),d0
  487.  bsr scandeltatext
  488. *                 if (!expandflag) {
  489. _18
  490.  move.l (sp),d0 :2
  491.  addq.l #1,d0 :2
  492.  lsl.l #2,d0 :2
  493.  movea.l 4(sp),a0
  494.  tst.l 0(a0,d0.l)
  495.  bne _19
  496. _17
  497.  tst.l 8+_2(sp)
  498.  bne _21
  499. _20
  500. *                         /* no keyword expansion; only invoked from ci */
  501. *                         scandeltatext(deltas[i],edit);
  502. *                         finishedit((struct hshentry *)nil);
  503. *                         ffclose(fcopy);
  504. *                 } else {
  505.  moveq.l #1,d1 :2
  506.  move.l (sp),d0 :2
  507.  lsl.l #2,d0 :2
  508.  movea.l 4(sp),a0
  509.  move.l 0(a0,d0.l),d0
  510.  bsr scandeltatext
  511.  moveq.l #0,d0 :2
  512.  bsr finishedit
  513.  move.l fcopy(a6),d0
  514.  bsr ffclose
  515.  bra _22
  516. _21
  517. *                         /* perform keyword expansion*/
  518. *                         /* first, get to beginning of file*/
  519. *                         finishedit((struct hshentry *)nil); swapeditfiles(dir==nil);
  520. *                         scandeltatext(deltas[i],edit_expand);
  521. *                         finishedit(deltas[i]);
  522. *                         if (dir!=nil) ffclose(fcopy);
  523.  moveq.l #0,d0 :2
  524.  bsr finishedit
  525.  tst.l 4+_2(sp)
  526.  bne _25
  527. _26
  528.  moveq.l #1,d0 :2
  529.  bra _27
  530. _25
  531.  moveq.l #0,d0 :2
  532. _27
  533.  bsr swapeditfiles
  534.  moveq.l #3,d1 :2
  535.  move.l (sp),d0 :2
  536.  lsl.l #2,d0 :2
  537.  movea.l 4(sp),a0
  538.  move.l 0(a0,d0.l),d0
  539.  bsr scandeltatext
  540.  move.l (sp),d0 :2
  541.  lsl.l #2,d0 :2
  542.  movea.l 4(sp),a0
  543.  move.l 0(a0,d0.l),d0
  544.  bsr finishedit
  545.  tst.l 4+_2(sp)
  546.  beq _24
  547. _23
  548. *                 }
  549.  move.l fcopy(a6),d0
  550.  bsr ffclose
  551. _24
  552. *                 return(resultfile); /*doesn't matter for dir==nil*/
  553. _22
  554.  move.l resultfile(a6),d0
  555.  addq.l #4,sp :2
  556.  bra _4
  557. *         }
  558. * }
  559. _13
  560.  addq.l #4,sp :2
  561. _4
  562.  movem.l -4(a5),#_1
  563.  unlk a5
  564.  rts :2
  565. _3 equ 0xffffffb8 :0
  566. _1 equ 0x00000100 :0
  567. _2 equ 0x00000014 :0
  568. * scandeltatext(delta,func)
  569. * struct hshentry * delta; enum stringwork func;
  570. * /* Function: Scans delta text nodes up to and including the one given
  571. * {       struct hshentry * nextdelta;
  572.  ttl scandelt
  573. scandeltatext:  link a5,#0
  574.  movem.l #_28!3,-(sp)
  575.  move.l #_30,d0 :6
  576.  bsr _stkcheck
  577. *         do {
  578.  subq.l #4,sp :2
  579. _34
  580. *                 nextlex();
  581. *                 if (!(nextdelta=getnum())) {
  582.  bsr nextlex
  583.  bsr getnum
  584.  move.l d0,(sp) :2
  585.  bne _36
  586. _35
  587. *                         fatserror("Can't find delta for revision %s", delta->num);
  588. *                 }
  589.  movea.l 4(sp),a0
  590.  move.l (a0),d1 :2
  591.  lea _37(pc),a0
  592.  move.l a0,d0 :2
  593.  bsr fatserror
  594. *                 if (!getkey(Klog) || nexttok!=STRING)
  595. _36
  596. *                         serror("Missing log entry");
  597.  lea Klog(a6),a0
  598.  move.l a0,d0 :2
  599.  bsr getkey
  600.  tst.l d0 :2
  601.  beq _38
  602. _40
  603.  moveq.l #15,d0 :2
  604.  cmp.l nexttok(a6),d0
  605.  beq _39
  606. _38
  607. *                 elsif (delta==nextdelta) {
  608.  lea _41(pc),a0
  609.  move.l a0,d0 :2
  610.  bsr serror
  611.  bra _42
  612. _39
  613.  move.l 4(sp),d0
  614.  cmp.l (sp),d0 :2
  615.  bne _44
  616. _43
  617. *                         VOID savestring(curlogmsg,logsize);
  618. *                         delta->log=curlogmsg;
  619. *                 } else {readstring();
  620.  move.l #4096,d1 :6
  621.  lea curlogmsg(a6),a0
  622.  move.l a0,d0 :2
  623.  bsr savestring
  624.  lea curlogmsg(a6),a0
  625.  movea.l 4(sp),a1
  626.  move.l a0,16(a1)
  627.  bra _45
  628. _44
  629. *                         delta->log= "";
  630. *                 }
  631.  bsr readstring
  632.  lea _46(pc),a0
  633.  movea.l 4(sp),a1
  634.  move.l a0,16(a1)
  635. *                 nextlex();
  636. _45
  637. _42
  638. *                 if (!getkey(Ktext) || nexttok!=STRING)
  639. *                         fatserror("Missing delta text");
  640.  bsr nextlex
  641.  lea Ktext(a6),a0
  642.  move.l a0,d0 :2
  643.  bsr getkey
  644.  tst.l d0 :2
  645.  beq _47
  646. _49
  647.  moveq.l #15,d0 :2
  648.  cmp.l nexttok(a6),d0
  649.  beq _48
  650. _47
  651. *                 if(delta==nextdelta)
  652.  lea _50(pc),a0
  653.  move.l a0,d0 :2
  654.  bsr fatserror
  655. _48
  656. *                         /* got the one we're looking for */
  657. *                         switch (func) {
  658.  move.l 4(sp),d0
  659.  cmp.l (sp),d0 :2
  660.  bne _52
  661. _51
  662.  bra _54
  663. *                         case copy:      copystring();
  664. _55
  665. *                                         break;
  666.  bsr copystring
  667.  bra _53
  668. *                         case expand:    xpandstring(delta);
  669. _56
  670. *                                         break;
  671.  move.l 4(sp),d0
  672.  bsr xpandstring
  673.  bra _53
  674. *                         case edit:      editstring((struct hshentry *)nil);
  675. _57
  676. *                                         break;
  677.  moveq.l #0,d0 :2
  678.  bsr editstring
  679.  bra _53
  680. *                         case edit_expand: editstring(delta);
  681. _58
  682. *                                         break;
  683.  move.l 4(sp),d0
  684.  bsr editstring
  685.  bra _53
  686. *                         }
  687. *                 else    readstring(); /* skip over it */
  688. _54
  689.  move.l 8(sp),d0
  690.  cmpi.l #3,d0 :6
  691.  bhi _53
  692.  add.w d0,d0 :2
  693.  move.w _59(pcr,d0.w),d0
  694.  jmp _59(pcr,d0.w)
  695. _59
  696.  dc.w _55-_59 :2
  697.  dc.w _57-_59 :2
  698.  dc.w _56-_59 :2
  699.  dc.w _58-_59 :2
  700. _53
  701.  bra _60
  702. _52
  703. *         } while (delta!=nextdelta);
  704.  bsr readstring
  705. _60
  706. _32
  707.  move.l 4(sp),d0
  708.  cmp.l (sp),d0 :2
  709.  bne _34
  710. _33
  711. * }
  712.  addq.l #4,sp :2
  713. _31
  714.  movem.l -8(a5),#_28
  715.  unlk a5
  716.  rts :2
  717. _30 equ 0xffffffb8 :0
  718. _28 equ 0x00000300 :0
  719. _29 equ 0x00000018 :0
  720. * int stdinread; /* stdinread>0 if redirected stdin has been read once */
  721.  vsect
  722. stdinread: ds.l 1
  723. * int ttystdin()
  724. * {
  725.  ends
  726.  ttl ttystdin
  727. ttystdin:  link a5,#0
  728.  movem.l #_61!1,-(sp)
  729.  move.l #_63,d0 :6
  730.  bsr _stkcheck
  731. *     static int initialized, istty;
  732.  vsect
  733. _65 ds.l 1
  734. _66 ds.l 1
  735.  
  736. *     if (!initialized) {
  737.  ends
  738.  tst.l _65(a6)
  739.  bne _68
  740. _67
  741. *         istty = isatty(fileno(stdin));
  742. *         initialized = 1;
  743. *     }
  744.  movea.w _iob+14(a6),a0
  745.  move.l a0,d0 :2
  746.  bsr isatty
  747.  move.l d0,_66(a6)
  748.  moveq.l #1,d0 :2
  749.  move.l d0,_65(a6)
  750. *     return istty;
  751. _68
  752.  move.l _66(a6),d0
  753.  bra _64
  754. * }
  755.  nop :2
  756. _64
  757.  movem.l -4(a5),#_61
  758.  unlk a5
  759.  rts :2
  760. _63 equ 0xffffffbc :0
  761. _61 equ 0x00000100 :0
  762. _62 equ 0x00000010 :0
  763. * void putdesc(initflag,textflag,textfile,quietflag)
  764. * int initflag,textflag; char * textfile; int quietflag;
  765. * /* Function: puts the descriptive text into file frewrite.
  766. * {       register FILE * txt; register int c, old1, old2;
  767.  ttl putdesc
  768. putdesc:  link a5,#0
  769.  movem.l #_69!3,-(sp)
  770.  move.l #_71,d0 :6
  771.  bsr _stkcheck
  772. *     register FILE * frew;
  773. * #ifdef lint
  774. *     if (quietflag ==  0) initflag = quietflag; /* silencelint */
  775. * #endif
  776. *     frew = frewrite;
  777. *         if (!initflag && !textflag) {
  778.  movea.l frewrite(a6),a3
  779.  tst.l (sp) :2
  780.  bne _74
  781. _75
  782.  tst.l 4(sp)
  783.  bne _74
  784. _73
  785. *                 /* copy old description */
  786. *                 VOID fprintf(frew,"\n\n%s%c",Kdesc,nextc);
  787. *                 rewriteflag=true; getdesc(false);
  788. *         } else {
  789.  move.l nextc(a6),-(sp)
  790.  pea Kdesc(a6)
  791.  lea _76(pc),a0
  792.  move.l a0,d1 :2
  793.  move.l a3,d0 :2
  794.  bsr fprintf
  795.  addq.l #8,sp :2
  796.  moveq.l #1,d0 :2
  797.  move.l d0,rewriteflag(a6)
  798.  moveq.l #0,d0 :2
  799.  bsr getdesc
  800.  bra _77
  801. _74
  802. *                 /* get new description */
  803. *                if (!initflag) {
  804.  tst.l (sp) :2
  805.  bne _79
  806. _78
  807. *                         /*skip old description*/
  808. *                         rewriteflag=false; getdesc(false);
  809. *                 }
  810.  clr.l rewriteflag(a6)
  811.  moveq.l #0,d0 :2
  812.  bsr getdesc
  813. *                 VOID fprintf(frew,"\n\n%s\n%c",Kdesc,SDELIM);
  814. _79
  815. *                 if (textfile) {
  816.  pea 64.w
  817.  pea Kdesc(a6)
  818.  lea _82(pc),a0
  819.  move.l a0,d1 :2
  820.  move.l a3,d0 :2
  821.  bsr fprintf
  822.  addq.l #8,sp :2
  823.  tst.l -1048576+_70(sp)
  824.  beq _81
  825. _80
  826. *                         old1='\n';
  827. *                         /* copy textfile */
  828. *                         if ((txt=fopen(textfile,"r"))!=NULL) {
  829.  moveq.l #13,d5 :2
  830.  lea _85(pc),a0
  831.  move.l a0,d1 :2
  832.  move.l -1048576+_70(sp),d0
  833.  bsr fopen
  834.  movea.l d0,a2 :2
  835.  tst.l d0 :2
  836.  beq _84
  837. _83
  838. *                                 while ((c=getc(txt))!=EOF) {
  839.  bra _87
  840. _88
  841. *                                         if (c==SDELIM) VOID putc(c,frew); /*double up*/
  842.  moveq.l #64,d0 :2
  843.  cmp.l d4,d0 :2
  844.  bne _90
  845. _89
  846. *                                         VOID putc(c,frew);
  847.  move.l a3,d1 :2
  848.  move.l d4,d0 :2
  849.  bsr putc
  850. _90
  851. *                                         old1=c;
  852. *                                 }
  853.  move.l a3,d1 :2
  854.  move.l d4,d0 :2
  855.  bsr putc
  856.  move.l d4,d5 :2
  857. *                                 if (old1!='\n') VOID putc('\n',frew);
  858. _87
  859.  move.l a2,d0 :2
  860.  bsr getc
  861.  move.l d0,d4 :2
  862.  moveq.l #-1,d1 :2
  863.  cmp.l d0,d1 :2
  864.  bne _88
  865. _86
  866.  moveq.l #13,d0 :2
  867.  cmp.l d5,d0 :2
  868.  beq _92
  869. _91
  870. *                                 VOID fclose(txt);
  871.  move.l a3,d1 :2
  872.  moveq.l #13,d0 :2
  873.  bsr putc
  874. _92
  875. *                 VOID putc(SDELIM,frew);
  876. *                 VOID fputs("\n\n", frew);
  877. *                 return;
  878.  move.l a2,d0 :2
  879.  bsr fclose
  880.  move.l a3,d1 :2
  881.  moveq.l #64,d0 :2
  882.  bsr putc
  883.  move.l a3,d1 :2
  884.  lea _93(pc),a0
  885.  move.l a0,d0 :2
  886.  bsr fputs
  887.  bra _72
  888. *                         } else {
  889.  bra _94
  890. _84
  891. *                                 error("Can't open file %s with description",textfile);
  892. *                                 if (!ttystdin()) return;
  893.  move.l -1048576+_70(sp),d1
  894.  lea _97(pc),a0
  895.  move.l a0,d0 :2
  896.  bsr error
  897.  bsr ttystdin
  898.  tst.l d0 :2
  899.  bne _96
  900. _95
  901.  bra _72
  902. *                                 /* otherwise, get description from terminal */
  903. *                         }
  904. _96
  905. *                 }
  906. _94
  907. *                 /* read text from stdin */
  908. *                 if (ttystdin()) {
  909. _81
  910.  bsr ttystdin
  911.  tst.l d0 :2
  912.  beq _99
  913. _98
  914. * #ifdef MSDOS
  915. *                     VOID fputs("enter description, terminated with ^Z or '.':\n",stderr);
  916. * #else
  917. * #ifdef OSK
  918. *                     VOID fputs("entern description , terminated with ESC or '.':\n",stderr);
  919. * #else
  920. *                     VOID fputs("enter description, terminated with ^D or '.':\n",stderr);
  921. * #endif /* OSK */                    
  922. * #endif /* MSDOS */
  923. *                     VOID fputs("NOTE: This is NOT the log message!\n>> ",stderr);
  924. *                     fflush(stderr);
  925. *             if (feof(stdin))
  926. *                     clearerr(stdin);
  927.  lea _iob+56(a6),a0
  928.  move.l a0,d1 :2
  929.  lea _102(pc),a0
  930.  move.l a0,d0 :2
  931.  bsr fputs
  932.  lea _iob+56(a6),a0
  933.  move.l a0,d1 :2
  934.  lea _103(pc),a0
  935.  move.l a0,d0 :2
  936.  bsr fputs
  937.  lea _iob+56(a6),a0
  938.  move.l a0,d0 :2
  939.  bsr fflush
  940.  btst.b #4,_iob+13(a6) :6
  941.  beq _101
  942. _100
  943. *                 } else {  /* redirected stdin */
  944.  andi.w #-33,_iob+12(a6) :6
  945. _101
  946.  bra _104
  947. _99
  948. *                     if (stdinread>0)
  949. *                         faterror("Can't reread redirected stdin for description; use -t<file>");
  950.  tst.l stdinread(a6)
  951.  ble _106
  952. _105
  953. *                     stdinread++;
  954.  lea _107(pc),a0
  955.  move.l a0,d0 :2
  956.  bsr faterror
  957. _106
  958. *                 }
  959.  addq.l #1,stdinread(a6)
  960. *                 c = '\0'; old2= '\n';
  961. _104
  962. *                 if ((old1=getchar())==EOF) {
  963.  moveq.l #0,d4 :2
  964.  moveq.l #13,d6 :2
  965.  lea _iob(a6),a0
  966.  move.l a0,d0 :2
  967.  bsr getc
  968.  move.l d0,d5 :2
  969.  moveq.l #-1,d1 :2
  970.  cmp.l d0,d1 :2
  971.  bne _109
  972. _108
  973. *                         if (ttystdin()) {
  974.  bsr ttystdin
  975.  tst.l d0 :2
  976.  beq _111
  977. _110
  978. *                              VOID putc('\n',stderr);
  979. * #ifdef OSK
  980. *                              cleareof(stdin);
  981. * #endif
  982. *                              clearerr(stdin);
  983. *             }
  984.  lea _iob+56(a6),a0
  985.  move.l a0,d1 :2
  986.  moveq.l #13,d0 :2
  987.  bsr putc
  988.  andi.w #-17,_iob+12(a6) :6
  989.  andi.w #-33,_iob+12(a6) :6
  990. *         } else {
  991. _111
  992.  bra _112
  993. _109
  994. *              if (old1=='\n' && ttystdin())
  995. *              VOID fputs(">> ",stderr);
  996.  moveq.l #13,d0 :2
  997.  cmp.l d5,d0 :2
  998.  bne _114
  999. _115
  1000.  bsr ttystdin
  1001.  tst.l d0 :2
  1002.  beq _114
  1003. _113
  1004. *              fflush(stderr);
  1005.  lea _iob+56(a6),a0
  1006.  move.l a0,d1 :2
  1007.  lea _116(pc),a0
  1008.  move.l a0,d0 :2
  1009.  bsr fputs
  1010. _114
  1011. *              for (;;) {
  1012.  lea _iob+56(a6),a0
  1013.  move.l a0,d0 :2
  1014.  bsr fflush
  1015. _117
  1016. *                 c=getchar();
  1017. *                 if (c==EOF) {
  1018.  lea _iob(a6),a0
  1019.  move.l a0,d0 :2
  1020.  bsr getc
  1021.  move.l d0,d4 :2
  1022.  moveq.l #-1,d0 :2
  1023.  cmp.l d4,d0 :2
  1024.  bne _120
  1025. _119
  1026. *                     if (ttystdin()) {
  1027.  bsr ttystdin
  1028.  tst.l d0 :2
  1029.  beq _122
  1030. _121
  1031. *                         VOID putc('\n',stderr);
  1032. * #ifdef OSK
  1033. *                         cleareof(stdin);
  1034. * #endif
  1035. *                         clearerr(stdin);
  1036. *                     }
  1037.  lea _iob+56(a6),a0
  1038.  move.l a0,d1 :2
  1039.  moveq.l #13,d0 :2
  1040.  bsr putc
  1041.  andi.w #-17,_iob+12(a6) :6
  1042.  andi.w #-33,_iob+12(a6) :6
  1043. *                                     VOID putc(old1,frew);
  1044. _122
  1045. *                                     if (old1!='\n') VOID putc('\n',frew);
  1046.  move.l a3,d1 :2
  1047.  move.l d5,d0 :2
  1048.  bsr putc
  1049.  moveq.l #13,d0 :2
  1050.  cmp.l d5,d0 :2
  1051.  beq _124
  1052. _123
  1053. *                                     break;
  1054.  move.l a3,d1 :2
  1055.  moveq.l #13,d0 :2
  1056.  bsr putc
  1057. _124
  1058.  bra _118
  1059. *                             }
  1060. *                             if (c=='\n' && old1=='.' && old2=='\n') {
  1061. _120
  1062.  moveq.l #13,d0 :2
  1063.  cmp.l d4,d0 :2
  1064.  bne _126
  1065. _128
  1066.  moveq.l #46,d0 :2
  1067.  cmp.l d5,d0 :2
  1068.  bne _126
  1069. _127
  1070.  moveq.l #13,d0 :2
  1071.  cmp.l d6,d0 :2
  1072.  bne _126
  1073. _125
  1074. *                                     break;
  1075.  bra _118
  1076. *                             }
  1077. *                             if (c=='\n' && ttystdin()) VOID fputs(">> ",stderr);
  1078. _126
  1079.  moveq.l #13,d0 :2
  1080.  cmp.l d4,d0 :2
  1081.  bne _130
  1082. _131
  1083.  bsr ttystdin
  1084.  tst.l d0 :2
  1085.  beq _130
  1086. _129
  1087. *                             fflush(stderr);
  1088.  lea _iob+56(a6),a0
  1089.  move.l a0,d1 :2
  1090.  lea _132(pc),a0
  1091.  move.l a0,d0 :2
  1092.  bsr fputs
  1093. _130
  1094. *                 if(old1==SDELIM) VOID putc(old1,frew); /* double up*/
  1095.  lea _iob+56(a6),a0
  1096.  move.l a0,d0 :2
  1097.  bsr fflush
  1098.  moveq.l #64,d0 :2
  1099.  cmp.l d5,d0 :2
  1100.  bne _134
  1101. _133
  1102. *                 VOID putc(old1,frew);
  1103.  move.l a3,d1 :2
  1104.  move.l d5,d0 :2
  1105.  bsr putc
  1106. _134
  1107. *                             old2=old1;
  1108. *                             old1=c;
  1109. *                     } /* end for */
  1110.  move.l a3,d1 :2
  1111.  move.l d5,d0 :2
  1112.  bsr putc
  1113.  move.l d5,d6 :2
  1114.  move.l d4,d5 :2
  1115. *         }
  1116.  bra _117
  1117. _118
  1118. *         VOID putc(SDELIM,frew); VOID fputs("\n\n",frew);
  1119. _112
  1120. *         }
  1121.  move.l a3,d1 :2
  1122.  moveq.l #64,d0 :2
  1123.  bsr putc
  1124.  move.l a3,d1 :2
  1125.  lea _135(pc),a0
  1126.  move.l a0,d0 :2
  1127.  bsr fputs
  1128. * }
  1129. _77
  1130. _72
  1131.  movem.l -24(a5),#_69
  1132.  unlk a5
  1133.  rts :2
  1134. _71 equ 0xffffffb4 :0
  1135. _69 equ 0x00000d70 :0
  1136. _70 equ 0x00000028 :0
  1137. _37 dc.b "Can't find delta for revision %s",$0
  1138. _41 dc.b "Missing log entry",$0
  1139. _46 dc.b $0
  1140. _50 dc.b "Missing delta text",$0
  1141. _76 dc.b $d,$d,"%s%c",$0
  1142. _82 dc.b $d,$d,"%s",$d,"%c",$0
  1143. _85 dc.b "r",$0
  1144. _93 dc.b $d,$d,$0
  1145. _97 dc.b "Can't open file %s with description",$0
  1146. _102 dc.b "entern description , terminated with ESC or '.':",$d,$0
  1147. _103 dc.b "NOTE: This is NOT the log message!",$d,">> ",$0
  1148. _107 dc.b "Can't reread redirected stdin for description; use -t<file>",$0
  1149. _116 dc.b ">> ",$0
  1150. _132 dc.b ">> ",$0
  1151. _135 dc.b $d,$d,$0
  1152.  ends
  1153.