source: trunk/athena/bin/delete/stack.c @ 12350

Revision 12350, 3.3 KB checked in by ghudson, 26 years ago (diff)
Some RCS ID cleanup: delete $Log$ and replace other RCS keywords with $Id$.
Line 
1/*
2 * $Id: stack.c,v 1.13 1999-01-22 23:09:06 ghudson Exp $
3 *
4 * This program is part of a package including delete, undelete,
5 * lsdel, expunge and purge.  The software suite is meant as a
6 * replacement for rm which allows for file recovery.
7 *
8 * Copyright (c) 1989 by the Massachusetts Institute of Technology.
9 * For copying and distribution information, see the file "mit-copying.h."
10 */
11
12#if (!defined(lint) && !defined(SABER))
13     static char rcsid_stack_c[] = "$Id: stack.c,v 1.13 1999-01-22 23:09:06 ghudson Exp $";
14#endif
15
16#include <sys/types.h>
17#include <stdio.h>
18#include <errno.h>
19#include "stack.h"
20#include "delete_errs.h"
21#include "errors.h"
22#include "mit-copying.h"
23#include "util.h"
24
25#define STACK_INC       25
26
27
28
29int dostack(data, op, bytes)
30caddr_t data;
31int op, bytes;
32{
33     static caddr_t stack = (caddr_t) NULL;
34     static int size = 0, count = 0;
35     
36     switch (op) {
37     case EMPTY_STACK:
38          if (size) {
39               free(stack);
40               stack = (caddr_t) NULL;
41               size = count = 0;
42          }
43#ifdef STACK_DEBUG
44          fprintf(stderr, "dostack: return 1 (EMPTY_STACK).\n");
45#endif
46          return 0;
47     case STACK_PUSH:
48          if (bytes == 0) {
49#ifdef STACK_DEBUG
50               fprintf(stderr, "Pushing 0 bytes at %d offset.\n", count);
51               fprintf(stderr, "dostack: return 2 (STACK_PUSH).\n");
52#endif
53               return 0;
54          }
55          if (size - count < bytes) {
56               do
57                    size += STACK_INC;
58               while (size - count < bytes);
59               stack = (caddr_t) (stack ? realloc((char *) stack,
60                                                  (unsigned) size) :
61                                  Malloc((unsigned) size));
62               if ((! stack) && size)
63               {
64                    size = count = 0;
65                    set_error(errno);
66                    error("Malloc");
67#ifdef STACK_DEBUG
68                    fprintf(stderr, "dostack: return 3 (STACK_PUSH).\n");
69#endif
70                    return error_code;
71               }
72          }
73#ifdef STACK_DEBUG
74          fprintf(stderr, "Pushing %d bytes at %d offset.\n", bytes, count);
75#endif
76          memcpy(stack + count, data, bytes);
77          count += bytes;
78#ifdef STACK_DEBUG
79          fprintf(stderr, "dostack: return 4 (STACK_PUSH).\n");
80#endif
81          return 0;
82     case STACK_POP:
83          if (bytes == 0) {
84#ifdef STACK_DEBUG
85               fprintf(stderr, "Popping 0 bytes at %d offset.\n", count);
86               fprintf(stderr, "dostack: return 5 (STACK_POP).\n");
87#endif
88               return 0;
89          }
90          if (count == 0) {
91               set_status(STACK_EMPTY);
92#ifdef STACK_DEBUG
93               fprintf(stderr, "dostack: return 6 (STACK_POP).\n");
94#endif
95               return error_code;
96          }
97          else {
98               int newblocks, newsize;
99
100               count -= bytes;
101#ifdef STACK_DEBUG
102               fprintf(stderr, "Popping %d bytes at %d offset.\n", bytes,
103                       count);
104#endif
105               memcpy(data, stack + count, bytes);
106               newblocks = count / STACK_INC + ((count % STACK_INC) ? 1 : 0);
107               newsize = newblocks * STACK_INC;
108               if (newsize < size) {
109                    size = newsize;
110                    stack = (caddr_t) realloc((char *) stack, (unsigned) size);
111                    if ((! stack) && size)
112                    {
113                         set_error(errno);
114                         error("realloc");
115#ifdef STACK_DEBUG
116                         fprintf(stderr, "dostack: return 7 (STACK_POP).\n");
117#endif
118                         return error_code;
119                    }
120               }
121#ifdef STACK_DEBUG
122               fprintf(stderr, "dostack: return 8 (STACK_POP).\n");
123#endif
124               return 0;
125          }
126     default:
127          set_error(STACK_BAD_OP);
128#ifdef STACK_DEBUG
129          fprintf(stderr, "dostack: return 9.\n");
130#endif
131          return error_code;
132     }
133}
Note: See TracBrowser for help on using the repository browser.