Update the changelog
[opencv] / apps / Hawk / CVEiCL / EiC / src / stab.c
1 /* stringtab.c
2  *
3  *      (C) Copyright Apr 20 1997, Edmond J. Breen.
4  *                 ALL RIGHTS RESERVED.
5  * This code may be copied for personal, non-profit use only.
6  *
7  */
8
9
10
11 #include <stdio.h>
12 #include <string.h>
13 #include "xalloc.h"
14 #include "stab.h"
15
16 /* STRING TABLE ROUTINES
17    -------------------*/
18 char * stab_PopLastString(stab_t *stab)
19 {
20     char * p;
21     if(stab->n) {
22         stab->n--;
23         p = stab->strs[stab->n];
24         if(stab->n)
25             stab->strs = xrealloc(stab->strs, sizeof(*stab->strs) * (stab->n));
26         else
27             xfree(stab->strs);
28     } else
29         p = NULL;
30
31     return p;
32 }
33
34 int EiC_stab_FindString(stab_t *stab, char *s)
35 {
36     int i;
37     char **strs = stab->strs;
38     
39     for(i=0;i<stab->n;++i,++strs)
40         if(strcmp(*strs,s) == 0)
41             return i;
42     return -1;
43 }
44     
45 int EiC_stab_RemoveString(stab_t *stab, char *s)
46 {
47     int i = EiC_stab_FindString(stab,s);
48     if(i >= 0) {
49         xfree(stab->strs[i]);
50         if(i != stab->n - 1) 
51             memcpy(&stab->strs[i],
52                    &stab->strs[i+1],
53                    (stab->n - i - 1) * sizeof(char*));
54         stab->n--;
55         if(stab->n) 
56             stab->strs = xrealloc(stab->strs,
57                               sizeof(char*) * stab->n);
58         else
59             xfree(stab->strs);
60         return 1;
61     }
62
63     return -1;
64 }
65         
66
67 char * EiC_stab_SaveString(stab_t *stab, char *s)
68 {
69     char *EiC_strsave(char*);
70     int i;
71     if((i=EiC_stab_FindString(stab,s)) < 0) {
72         if(stab->n == 0)
73             stab->strs = xmalloc(sizeof(*stab->strs));
74         else
75             stab->strs = xrealloc(stab->strs, sizeof(*stab->strs) * (stab->n+1));
76         i = stab->n; 
77         stab->strs[i] = EiC_strsave(s);
78         stab->n++;
79     }
80     return stab->strs[i];
81         
82 }
83
84 size_t EiC_stab_NextEntryNum(stab_t *stab)
85 {
86     return stab->n;
87 }
88
89 void EiC_stab_CleanUp(stab_t *stab, size_t bot)
90 {
91     while(stab->n> bot)
92         xfree(stab_PopLastString(stab));
93 }
94
95 void EiC_stab_Mark(stab_t *stab, char mark)
96 {
97     int i;
98     if(stab->n) {
99         xmark(stab->strs,mark);
100         for(i=0;i<stab->n;++i) 
101             xmark(stab->strs[i],mark);
102     }
103 }
104
105 void EiC_stab_ShowStrings(stab_t *stab)
106 {
107     int i;
108     for(i=0;i<stab->n;++i)
109         printf("%s\n",stab->strs[i]);
110 }
111 /*END STRING TABLE ROUTINES*/
112
113
114
115
116
117
118
119
120
121
122