]> asedeno.scripts.mit.edu Git - 1ts-debian.git/blob - zephyr/clients/xzwrite/yank.c
Initial revision
[1ts-debian.git] / zephyr / clients / xzwrite / yank.c
1 #include "xzwrite.h"
2
3 static Yank yank_buffer;
4 extern Defaults defs;
5
6 static int read_index, write_index, highest;
7
8 void yank_init()
9 {
10      yank_buffer = (Yank) Malloc(defs.max_yanks*sizeof(YankRec),
11                                    "while allocating yank buffer", NULL);
12      (void) memset((char *) yank_buffer, 0, defs.max_yanks*sizeof(YankRec));
13
14      read_index = write_index = 0;
15      highest = -1;
16 }
17
18 Yank yank_prev()
19 {
20      if (highest == -1)
21           return NULL;
22      
23      if (--read_index < 0) read_index = highest;
24      return &yank_buffer[read_index];
25 }
26
27 Yank yank_next()
28 {
29      if (highest == -1)
30           return NULL;
31      
32      if (++read_index > highest) read_index = 0;
33      return &yank_buffer[read_index];
34 }
35
36 void yank_store(dest, msg)
37    Dest dest;
38    char *msg;
39 {
40      yank_buffer[write_index].dest = *dest;
41      if (yank_buffer[write_index].msg)
42          free(yank_buffer[write_index].msg);
43      yank_buffer[write_index].msg = (char *) Malloc(strlen(msg) + 1,
44                                                     "while yanking message",
45                                                     NULL);
46      strcpy(yank_buffer[write_index].msg, msg);
47
48      /*
49       * read_index  = write_index + 1 so that if I follow the store by
50       * a yank_prev I will get the message just stored (since
51       * read_index is decremented before being used).  If I do a
52       * yank_next, then read_index will be > highest and reset to zero.
53       */
54      read_index = write_index + 1;
55      if (write_index > highest)
56           highest = write_index;
57      write_index = (write_index + 1) % defs.max_yanks;
58 }