root/trunk/cienv.c

Revision 389, 7.9 kB (checked in by heitor.barbieri, 3 weeks ago)

essage first commit

Line 
1/* ----------------------------------------------------------------- CIENV.C */
2
3/* -------------------------------------------------------------- C includes */
4#include <stdlib.h>
5#include <stdio.h>
6#include <string.h>
7#include <ctype.h>
8/* ----------------------------------------------------------- CISIS include */
9#include "cisis.h"
10#include "globdef.h"
11#include "appeasy.h"
12#include "cienv.h"
13/* --------------------------------------------------------------- externals */
14extern RECSTRU *vrecp[];
15extern TRMSTRU *vtrmp[];
16/* -------------------------------------------------------- global variables */
17#if STATIC_ENVB
18UCHAR  env_buff[NCTOTENVB+1];
19#else /* STATIC_ENVB */
20UCHAR  *env_buff = NULL;
21#endif /* STATIC_ENVB */
22
23/* -------------------------------------------------------------- env_strtab */
24UCHAR *env_strtab(s)
25UCHAR *s;
26{
27   UCHAR *p;
28
29   if (s)
30      for (p = s; *p; p++) *p = isisuctab[*p];
31   return s;
32}
33/* ------------------------------------------------------------- env_getfile */
34BOOLEAN env_getfile(format_name,b,max,ignore)
35UCHAR *format_name,
36      *b;
37int    max;
38UCHAR *ignore;
39{
40   while (*format_name == ' ') format_name++;
41   if (*format_name != FMTFILEID) {
42
43      if (strlen(format_name) > max) {
44         printf("env_getfile/max");
45         fatal(format_name);
46      }
47
48      strcpy(b,format_name);
49      return TRUE;
50   }
51   format_name = dbxcipar(NULL,++format_name,'=');
52   return easy_getfile(format_name,b,max,ignore);
53}
54/* ------------------------------------------------------------- env_fmtfile */
55BOOLEAN env_fmtfile(format_name,b,max)
56UCHAR *format_name,*b;
57int    max;
58{
59   return env_getfile(format_name,b,max,"\n\r");
60}
61/* -------------------------------------------------------------- env_recall */
62long env_recall(nbytes)
63long nbytes;
64{
65   long idx;
66
67   for (idx = maxnrec; --idx >= 0L; )
68     if (!vrecp[idx]) { recallok(idx,nbytes > 0L ? nbytes : MAXMFRL); break; }
69   if (idx < 0L) fatal("env_recall");
70   return idx;
71}
72/* ------------------------------------------------------------ env_recdeall */
73void env_recdeall(idx)
74long idx;
75{
76   if (!vrecp[idx]) return;
77   FREE(vrecp[idx]);
78   vrecp[idx] = NULL;
79   nrecs--;
80}
81/* ------------------------------------------------------------ env_creatrec */
82long env_creatrec(crec,irec)
83long crec,irec;
84{
85   long nxtmfn;
86
87   nxtmfn = VMF0nxtmfn(crec);
88   record(irec,VRDBname(crec),nxtmfn);
89   VMFRstatus(irec) = ACTIVE;
90   VRECrc(irec) = RCNORMAL;
91   return nxtmfn;
92}
93/* ------------------------------------------------------------- env_workrec */
94void env_workrec(idx,mfrl)
95long idx;
96long mfrl;
97{
98   recallok(idx,mfrl);
99   VMFRstatus(idx) = ACTIVE;
100   VRECrc(idx) = RCNORMAL;
101   VMFRmfn(idx) = 1L;
102   VRECtype(idx) = TYPEMFR;
103   VMFRmfrl(idx) = VMFRbase(idx) = LEADER;
104}
105/* ------------------------------------------------------------- env_copyrec */
106void env_copyrec(torec,fromrec)
107long torec,fromrec;
108{
109   VRECrc(torec) = VRECrc(fromrec);
110   memcpy(VMFX(torec),VMFX(fromrec),VMFRmfrl(fromrec));
111}
112/* -------------------------------------------------------------- env_recupd */
113int env_recupd(irec,db)
114long   irec;
115UCHAR *db;
116{
117   long crec;
118   int  rc;
119
120   crec = env_recall((long)sizeof(M0STRU));
121   record(crec,db,0L);
122   if (VRECrc(crec) != RCNORMAL && VRECrc(crec) != RCLOCK) rc = VRECrc(crec);
123   else rc = recupdat(crec,irec);
124   env_recdeall(crec);
125   return rc;
126}
127/* -------------------------------------------------------------- env_recdel */
128int env_recdel(irec)
129long irec;
130{
131   if (!vrecp[irec]) fatal("env_recdel");
132   if (VRECrc(irec) != RCNORMAL && VRECrc(irec) != RCLOCK) return VRECrc(irec);
133   VMFRstatus(irec) = DELETED;
134   return env_recupd(irec,VRDBname(irec));
135}
136/* -------------------------------------------------------------- env_getfld */
137UCHAR *env_getfld(p,idx,tag,occ,nc)
138UCHAR *p;
139long idx;
140int  tag,occ,nc;
141{
142   int i;
143
144   if (occ > nocc(idx,tag)) return (UCHAR *)NULL;
145   if ((i = fieldx(idx,tag,occ)) < 0) return (UCHAR *)NULL;
146   if (VDIRlen(idx,i) > nc) fatal("env_getfld");
147   strncpy(p,VFIELDP(idx,i),VDIRlen(idx,i));
148   *(p+VDIRlen(idx,i)) = '\0';
149   return p;
150}
151/* -------------------------------------------------------------- env_subfld */
152UCHAR *env_subfld(to,fld,subf)
153UCHAR *to,*fld,*subf;
154{
155   UCHAR *p,
156         *find = NULL,
157         *t,
158         *subf_up = NULL,
159         *subf_lw = NULL;
160
161   strupr(subf_up = strall(subf));
162   strlwr(subf_lw = strall(subf));
163   for (p = fld; ; p++) {
164      find = strstr(p,subf_lw);
165      if (!find)
166         if ((find = strstr(p,subf_up)) == NULL) break;
167      p = find;
168      if (p == fld) break;
169      if (*(p-1) != SUBFIELD_LITERAL) break;
170   }
171   strdeall(subf_up);
172   strdeall(subf_lw);
173   if (!find) return (UCHAR *)NULL;
174   for (p += strlen(subf),t = to; *p; t++,p++) {
175      if (*p == SUBFIELD_ID)
176         if (*(p-1) != SUBFIELD_LITERAL) break;
177         else t--;
178      *t = *p;
179   }
180   *t = '\0';
181   return to;
182}
183/* ----------------------------------------------------------- env_getsubfld */
184UCHAR *env_getsubfld(p,idx,tag,occ,sf,nc)
185UCHAR *p;
186long idx;
187int tag,occ;
188UCHAR *sf;
189int nc;
190{
191   if (!env_getfld(p,idx,tag,occ,nc)) return (UCHAR *)NULL;
192   return env_subfld(p,p,sf);
193}
194/* ------------------------------------------------------------ env_allocfld */
195UCHAR *env_allocfld(idx,tag,occ)
196long idx;
197int  tag,occ;
198{
199   UCHAR *p;
200   int i;
201
202   if (occ > nocc(idx,tag)) return (UCHAR *)NULL;
203   if ((i = fieldx(idx,tag,occ)) < 0) return (UCHAR *)NULL;
204   p = (UCHAR *)ALLOC((ALLOPARM)VDIRlen(idx,i)+1);
205   if (!p) fatal("env_allocfld");
206   strncpy(p,VFIELDP(idx,i),VDIRlen(idx,i));
207   *(p+VDIRlen(idx,i)) = '\0';
208   return p;
209}
210/* ------------------------------------------------------------- env_getlong */
211BOOLEAN env_getlong(value,idx,tag,occ,subfld)
212long   *value,idx;
213int    tag,occ;
214UCHAR *subfld;
215{
216   if (!env_getfld(env_buff,idx,tag,occ,NCENVBUFF)) return FALSE;
217   if (subfld)
218      if (!env_subfld(env_buff,env_buff,subfld)) return FALSE;
219   *value = atol(env_buff);
220   return TRUE;
221}
222/* ----------------------------------------------------------- env_getnumber */
223BOOLEAN env_getnumber(value,idx,tag,occ,subfld)
224int   *value;
225long   idx;
226int    tag,occ;
227UCHAR *subfld;
228{
229   long long_value;
230
231   if (!env_getlong(&long_value,idx,tag,occ,subfld)) return FALSE;
232   *value = (int)long_value;
233   return TRUE;
234}
235/* -------------------------------------------------------------- env_delfld */
236UCHAR *env_delfld(idx,tag,occ)
237long idx;
238int tag,occ;
239{
240   if (tag > 0 && occ > 0) sprintf(env_buff,"D%d/%d",tag,occ);
241   else
242      if (tag > 0) sprintf(env_buff,"D%d",tag);
243      else sprintf(env_buff,"D*");
244   return fldupdat(idx,env_buff);
245}
246/* -------------------------------------------------------------- env_addfld */
247UCHAR *env_addfld(idx,tag,p,n)
248long idx;
249int tag;
250UCHAR *p;
251long n;
252{
253   long l;
254
255   if (p) {
256      l = strlen(p);
257      if (l > NCENVBUFF) {
258         fprintf(stderr,"l > NCENVBUFF = %"_LD_" > %"_LD_"\n",l,NCENVBUFF);
259         fatal("env_addfld/NCENVBUFF");
260      }
261      if (VMFRmfrl(idx)+l > VRECnbytes(idx)) {
262         fprintf(stderr,"VMFRmfrl(idx)+l > VRECnbytes(idx) = %"_LD_" > %"_LD_"\n",VMFRmfrl(idx)+l,VRECnbytes(idx));
263         fatal("env_addfld/mfrl");
264      }
265      if (l <= 0L) sprintf(env_buff,"A%d||",tag);
266      else sprintf(env_buff,"H %d %"_LD_" %s",tag,l,p);
267   } else sprintf(env_buff,"A%d|%"_LD_"|",tag,n);
268   return fldupdat(idx,env_buff);
269}
270/* -------------------------------------------------------------- env_modfld */
271UCHAR *env_modfld(idx,tag,p,n)
272long idx;
273int tag;
274UCHAR *p;
275long n;
276{
277   UCHAR *rtn;
278
279   rtn = env_delfld(idx,tag,0);
280   return rtn ? rtn : env_addfld(idx,tag,p,n);
281}
282/* -------------------------------------------------------------- env_trmall */
283long env_trmall(nbytes)
284long nbytes;
285{
286   long idx;
287
288   for (idx = maxntrm; --idx >= 0L; )
289     if (!vtrmp[idx]) { trmalloc(idx,nbytes); break; }
290   if (idx < 0L) fatal("env_trmall");
291   return idx;
292}
293/* ------------------------------------------------------------ env_trmdeall */
294void env_trmdeall(idx)
295long idx;
296{
297   if (!vtrmp[idx]) return;
298   FREE(vtrmp[idx]);
299   vtrmp[idx]=NULL;
300   ntrms--;
301}
Note: See TracBrowser for help on using the browser.