1 /* @(#)undodb.c 1.2 04/18/83
2 *
3 * Copyright -C- 1982 Barry S. Roitblat
4 *
5 *
6 * This file contains routines for recording (remembering) database
7 * activity to provide an undo capability for the gremlin picture editor.
8 */
9
10 #include "gremlin.h"
11 #include "grem2.h"
12
13 /* The following are used to point to the undo database lists */
14
15 UNELT *unlist, *unback;
16
17 /* imports from point.c */
18
19 POINT *PTInit(), *PTMakePoint();
20
21 /* imports from c */
22
23 extern char *malloc();
24 extern char *strcpy();
25
26 /* imports from db1.c */
27
28 extern DBClearElt();
29
30
31 UNRembAdd(element, db)
32 ELT *element, *(*db);
33 /*
34 * This routine records an addition to the database by saving
35 * a pointer to the new element
36 */
37
38 {
39 UNELT *temp;
40
41 temp = (UNELT *) malloc(sizeof(UNELT));
42 temp->action = ADD;
43 temp->dbase = db;
44 temp->oldelt = NULL;
45 temp->newelt = element;
46 temp->nextun = unlist;
47 unlist = temp;
48 } /* end RembAdd */
49
50 UNRembDelete(element, db)
51 ELT *element, *(*db);
52 /*
53 * This routine records a deletion from the database by saving
54 * a pointer to the deleted element
55 */
56
57 {
58 UNELT *temp;
59
60 temp = (UNELT *) malloc(sizeof(UNELT));
61 temp->action = DELETE;
62 temp->dbase = db;
63 temp->oldelt = element;
64 temp->newelt = NULL;
65 temp->nextun = unlist;
66 unlist = temp;
67 } /* end RembDelete */
68
69
70 UNRembMod(element, db)
71 ELT *element, *(*db);
72 /*
73 * This routine records a modification to the database. The
74 * element passed to it is the element which will be modified and it
75 * is therefore copied (copying the text and pointlist also)
76 * and save as oldelt. A pointer of the element (which will be
77 * modified) is saved in newelt.
78 */
79
80 {
81 POINT *pt;
82 UNELT *temp;
83 ELT *hold;
84
85 temp = (UNELT *) malloc(sizeof(UNELT));
86 temp->action = MOD;
87 temp->dbase = db;
88 temp->newelt = element;
89 temp->oldelt = hold = (ELT *) malloc(sizeof(ELT));
90 hold->type = element->type;
91 hold->brushf = element->brushf;
92 hold->size = element->size;
93 hold->textpt = malloc((unsigned) strlen(element->textpt) + 1);
94 (void) strcpy(hold->textpt, element->textpt);
95 pt = element->ptlist;
96 hold->ptlist = PTInit();
97 while ( !Nullpoint(pt) )
98 {
99 (void) PTMakePoint(pt->x, pt->y, &(hold->ptlist));
100 pt = PTNextPoint(pt);
101 } /* end while */
102 temp->nextun = unlist;
103 unlist = temp;
104 } /* end RembMod */
105
UNForget()106 UNForget()
107 /*
108 * This routine clears the undo database. The database is copied
109 * into the backup database and elements from the backup database
110 * are deleted and returned to free storage. If nothing is in the undo
111 * database, the backup database is preserved.
112 */
113
114 {
115 UNELT *temp;
116
117 if (unlist == nullun) return;
118 while (unback != nullun)
119 {
120 temp = unback->nextun;
121 switch (unback->action)
122 {
123 case ADD: free((char *) unback);
124 break;
125
126 case MOD:
127 case DELETE: DBClearElt(unback->oldelt);
128 free((char *) unback);
129 break;
130 } /* end switch */;
131 unback = temp;
132 } /* end while */;
133 unback = unlist;
134 unlist = nullun;
135 } /* end Forget */
136