root/tags/5.4.pre05/wxis_src/cixml.c

Revision 1, 14.4 kB (checked in by heitor.barbieri, 4 years ago)

Criação do svn para Cisis.

Line 
1/* ----------------------------------------------------------------- CIXML.C */
2
3/* ---------------------------------------------------------- C HEADER FILES */
4#include <stdio.h>
5#include <string.h>
6#include <ctype.h>
7/* ------------------------------------------------------------ HEADER FILES */
8#include "../cisis.h"
9#include "easyfc.h"
10#include "cixml.h"
11
12/* -------------------------------------------------------------- ciXmlError */
13CIXML_ERROR ciXmlError
14(
15        CIXML_STRUCT *ciXml,
16   CIXML_ERROR errorCode
17)
18{
19   return ciXml->errorCode = errorCode;
20}
21/* ----------------------------------------------------------------- i2xName */
22char *i2xName
23(
24        FIELD_ELEMENT_LIST *i2x,
25   int tag,
26   char subfield
27)
28{
29        int i;
30
31        for (i = 0; i < i2x->qtt; i++ )
32   {
33                if ( i2x->list[i].tag == tag )
34      {
35                        if ( i2x->list[i].subfield == subfield )
36         {
37                return i2x->list[i].name;
38         }
39      }
40   }
41
42   return NULL;
43}
44
45/* ---------------------------------------------------- subfieldAttributeXML */
46char *subfieldAttributeXML
47(
48        CIXML_STRUCT *ciXml,
49   int tag,
50   char *p,
51   long *lasting
52)
53{
54   long localLasting;
55   char *subfieldName;
56
57        localLasting = *lasting;
58        p++; localLasting--;
59        if ( localLasting )
60   {
61        subfieldName = i2xName(&(ciXml->i2x),tag,*p);
62      if ( subfieldName )
63      {
64         sprintf(ciXml->p," %s=\"",subfieldName);
65                ciXml->p += strlen(ciXml->p);
66      }
67      else
68      {
69                        sprintf(ciXml->p," %s%c=\"",isdigit(*p) ? "s": "",*p);
70                ciXml->p += strlen(ciXml->p);
71      }
72      p++; localLasting--;
73
74           for ( ; localLasting && *p != '^'; localLasting-- )
75        {
76                        sprintf(ciXml->p,"%c",*p++);
77                ciXml->p += strlen(ciXml->p);
78           }
79
80        sprintf(ciXml->p,"\"");
81                ciXml->p += strlen(ciXml->p);
82   }
83   *lasting = localLasting;
84
85   return p;
86}
87
88/* ------------------------------------------------------------------ occXML */
89void occXML
90(
91        RECSTRU *recp,
92        CIXML_STRUCT *ciXml,
93   int fldDir                           /* field directory entry */
94)
95{
96        char *p;
97   long lasting = 0L;
98
99        sprintf(ciXml->p,"      <%s",ciXml->occElement);
100        ciXml->p += strlen(ciXml->p);
101   if ( ciXml->style != CIXML_STYLE_FIXED_NOSF )
102   {
103           for (lasting = DIRlen(fldDir),p = FIELDP(fldDir); lasting; )
104        {
105                if ( *p == '^' )
106              {
107                p = subfieldAttributeXML(ciXml,DIRtag(fldDir),p,&lasting);
108           continue;
109              }
110                        p++;
111        lasting--;
112           }
113   }
114   sprintf(ciXml->p,">");
115        ciXml->p += strlen(ciXml->p);
116   for (lasting = DIRlen(fldDir),p = FIELDP(fldDir); lasting; lasting--)
117   {
118        if ( *p == '^' )
119      {
120                if ( ciXml->style != CIXML_STYLE_FIXED_NOSF )
121         {
122                break;
123         }
124      }
125      sprintf(ciXml->p,"%c",*p++);
126        ciXml->p += strlen(ciXml->p);
127   }
128        sprintf(ciXml->p,"</%s>\n",ciXml->occElement);
129        ciXml->p += strlen(ciXml->p);
130}
131
132/* -------------------------------------------------------- fieldsStyleFixed */
133void fieldsStyleFixed
134(
135        RECSTRU *recp,
136        CIXML_STRUCT *ciXml
137)
138{
139        int line;
140   int fldQtt;                          /* quantity of fields */
141   int fldDir;                          /* field directory entry */
142   int occDir;
143
144   fldQtt = MFRnvf;
145        for ( line = 0; line < ciXml->i2x.qtt; line++)
146   {
147
148        if ( !ciXml->i2x.list[line].tag )
149      {
150        continue;
151      }
152        if ( ciXml->i2x.list[line].subfield )
153      {
154        continue;
155      }
156
157                for (fldDir = 0; fldDir < fldQtt; fldDir++)
158        {
159        if ( DIRtag(fldDir) == ciXml->i2x.list[line].tag )
160         {
161                        if ( ciXml->style == CIXML_STYLE_FIXED_NOSF )
162            {
163                                        sprintf(ciXml->p,"   <%s %s=\"%d\" %s=\"%s\">\n",ciXml->fieldElement,ciXml->tagAttribute,ciXml->i2x.list[line].tag,ciXml->nameAttribute,ciXml->i2x.list[line].name);
164                                ciXml->p += strlen(ciXml->p);
165            }
166            else
167            {
168                                        sprintf(ciXml->p,"   <%s>\n",ciXml->i2x.list[line].name);
169            }
170                        ciXml->p += strlen(ciXml->p);
171                                for (occDir = fldDir; occDir < fldQtt; occDir++)
172                        {
173                                if ( DIRtag(occDir) != ciXml->i2x.list[line].tag )
174                   {
175                                continue;
176                         }
177                        occXML(recp,ciXml,occDir);
178            }
179                        if ( ciXml->style == CIXML_STYLE_FIXED_NOSF )
180            {
181                                        sprintf(ciXml->p,"   </%s>\n",ciXml->fieldElement);
182                                ciXml->p += strlen(ciXml->p);
183            }
184            else
185            {
186                                        sprintf(ciXml->p,"   </%s>\n",ciXml->i2x.list[line].name);
187            }
188                        ciXml->p += strlen(ciXml->p);
189            break;
190                        }
191      } /* for */
192
193      if ( fldDir >= fldQtt )
194      {
195                        if ( ciXml->style == CIXML_STYLE_FIXED_NOSF )
196                        {
197                                sprintf(ciXml->p,"   <%s %s=\"%d\" %s=\"%s\"/>\n",ciXml->fieldElement,ciXml->tagAttribute,ciXml->i2x.list[line].tag,ciXml->nameAttribute,ciXml->i2x.list[line].name);
198                        ciXml->p += strlen(ciXml->p);
199         }
200         else
201         {
202                sprintf(ciXml->p,"   <%s/>\n",ciXml->i2x.list[line].name);
203                        ciXml->p += strlen(ciXml->p);
204         }
205      }
206
207   } /* for */
208
209}
210
211/* ---------------------------------------------------------- fieldsStyleAll */
212void fieldsStyleAll
213(
214        RECSTRU *recp,
215        CIXML_STRUCT *ciXml
216)
217{
218   int fldQtt;                          /* quantity of fields */
219   int fldDir;                          /* field directory entry */
220   int tag;
221   int occDir;
222   char *fieldName;
223
224   fldQtt = MFRnvf;
225        for (fldDir = 0; fldDir < fldQtt; fldDir++)
226   {
227
228                tag = DIRtag(fldDir);
229      for ( occDir = 0; occDir < fldDir; occDir++)
230      {
231                if ( DIRtag(occDir) == tag )
232         {
233                break;
234         }
235      } /* for */
236      if ( occDir < fldDir )
237      {
238        continue;
239      }
240
241        fieldName = i2xName(&(ciXml->i2x),tag,'\0');
242
243                sprintf(ciXml->p,"   <%s %s=\"%d\"",ciXml->fieldElement,ciXml->tagAttribute,DIRtag(fldDir));
244        ciXml->p += strlen(ciXml->p);
245      if ( fieldName )
246           {
247                sprintf(ciXml->p," %s=\"%s\"",ciXml->nameAttribute,fieldName);
248                ciXml->p += strlen(ciXml->p);
249        }
250                sprintf(ciXml->p,">\n");
251        ciXml->p += strlen(ciXml->p);
252
253                for (occDir = fldDir; occDir < fldQtt; occDir++)
254        {
255                if (DIRtag(occDir) != tag)
256         {
257                continue;
258         }
259        occXML(recp,ciXml,occDir);
260                } /* for */
261
262                sprintf(ciXml->p,"   </%s>\n",ciXml->fieldElement);
263        ciXml->p += strlen(ciXml->p);
264
265   } /* for */
266
267}
268
269/* ------------------------------------------------------ subfieldElementXML */
270#define ELELENT_SUBFIELD_MAX    5
271
272char *subfieldElementXML
273(
274        CIXML_STRUCT *ciXml,
275   int tag,
276   char *p,
277   long *lasting
278)
279{
280   long localLasting;
281   char *subfieldName;
282   char elementSubField[ELELENT_SUBFIELD_MAX+1];
283
284        localLasting = *lasting;
285        p++; localLasting--;
286        if ( localLasting )
287   {
288        sprintf(ciXml->p,"\n      ");
289        ciXml->p += strlen(ciXml->p);
290                subfieldName = i2xName(&(ciXml->i2x),tag,*p);
291      if ( ciXml->style != CIXML_STYLE_GENERIC && !subfieldName )
292      {
293        sprintf(elementSubField,"%s%c",isdigit(*p) ? "s" : "",*p);
294         subfieldName = elementSubField;
295      }
296      if ( subfieldName )
297      {
298         sprintf(ciXml->p,"<%s>",subfieldName);
299                ciXml->p += strlen(ciXml->p);
300      }
301      else
302      {
303                        sprintf(ciXml->p,"<%s %s=\"%c\">",ciXml->subfieldElement,ciXml->idAttribute,*p);
304                ciXml->p += strlen(ciXml->p);
305      }
306      p++; localLasting--;
307
308           for ( ; localLasting && *p != '^'; localLasting-- )
309        {
310                        sprintf(ciXml->p,"%c",*p++);
311                ciXml->p += strlen(ciXml->p);
312           }
313
314        sprintf(ciXml->p,"</%s>",subfieldName ? subfieldName : ciXml->subfieldElement);
315        ciXml->p += strlen(ciXml->p);
316   }
317
318   *lasting = localLasting;
319
320   return p;
321}
322
323/* --------------------------------------------------------- fieldContentXML */
324void fieldContentXML
325(
326        RECSTRU *recp,
327        CIXML_STRUCT *ciXml,
328   int fldDir                           /* field directory entry */
329)
330{
331        char *p;
332   long lasting = 0L;
333   int hasSubField = 0;
334
335   for (lasting = DIRlen(fldDir),p = FIELDP(fldDir); lasting; )
336   {
337           if ( *p == '^' )
338      {
339        p = subfieldElementXML(ciXml,DIRtag(fldDir),p,&lasting);
340                hasSubField = 1;
341         continue;
342      }
343      else
344      {
345                sprintf(ciXml->p,"%c",*p);
346                ciXml->p += strlen(ciXml->p);
347      }
348                p++;
349      lasting--;
350   }
351   if ( hasSubField )
352   {
353        sprintf(ciXml->p,"\n   ");
354        ciXml->p += strlen(ciXml->p);
355   }
356}
357
358/* ------------------------------------------------------ fieldsStyleGeneric */
359#define GENERIC_FIELD_MAX       10
360
361void fieldsStyleGeneric
362(
363        RECSTRU *recp,
364        CIXML_STRUCT *ciXml
365)
366{
367   int fldQtt;                          /* quantity of fields */
368   int fldDir;                          /* field directory entry */
369   char *fieldName;
370   char genericField[GENERIC_FIELD_MAX+1];
371
372   fldQtt = MFRnvf;
373        for (fldDir = 0; fldDir < fldQtt; fldDir++)
374   {
375
376        fieldName = i2xName(&(ciXml->i2x),DIRtag(fldDir),'\0');
377
378      if ( ciXml->style == CIXML_STYLE_GENERIC )
379      {
380                        sprintf(ciXml->p,"   <%s %s=\"%d\"",ciXml->fieldElement,ciXml->tagAttribute,DIRtag(fldDir));
381                ciXml->p += strlen(ciXml->p);
382              if ( fieldName )
383                   {
384                sprintf(ciXml->p," %s=\"%s\"",ciXml->nameAttribute,fieldName);
385            ciXml->p += strlen(ciXml->p);
386                }
387                        sprintf(ciXml->p,">");
388         ciXml->p += strlen(ciXml->p);
389
390      }
391      else
392      {
393        if ( !fieldName )
394         {
395                if ( ciXml->style == CIXML_STYLE_SPECIFIED )
396            {
397                continue;
398            }
399                sprintf(genericField,"v%d",DIRtag(fldDir));
400                                fieldName = genericField;
401         }
402         sprintf(ciXml->p,"   <%s>",fieldName);
403                ciXml->p += strlen(ciXml->p);
404      }
405
406        fieldContentXML(recp,ciXml,fldDir);
407
408                sprintf(ciXml->p,"</%s>\n",ciXml->style == CIXML_STYLE_GENERIC ? ciXml->fieldElement : fieldName);
409        ciXml->p += strlen(ciXml->p);
410
411   } /* for */
412
413}
414
415/* --------------------------------------------------------------- fieldsXML */
416void fieldsXML
417(
418        RECSTRU *recp,
419        CIXML_STRUCT *ciXml
420)
421{
422        switch (ciXml->style)
423   {
424
425        case CIXML_STYLE_GENERIC:
426        case CIXML_STYLE_FULL:
427        case CIXML_STYLE_SPECIFIED:
428        fieldsStyleGeneric(recp,ciXml);
429        break;
430
431        case CIXML_STYLE_ALL:
432        fieldsStyleAll(recp,ciXml);
433        break;
434
435        case CIXML_STYLE_FIXED_NOSF:
436        if ( !ciXml->i2x.qtt )
437         {
438                                fieldsStyleAll(recp,ciXml);
439                                break;
440         }
441        case CIXML_STYLE_FIXED:
442        fieldsStyleFixed(recp,ciXml);
443        break;
444
445   } /* switch */
446}
447
448/* --------------------------------------------------------------- cixmlLoad */
449CIXML_ERROR cixmlLoad
450(
451        char *i2x,
452   CIXML_STRUCT *ciXml,
453   CIXML_STYLE default_style
454)
455{
456   int line;
457   FIELD_ELEMENT *auxFieldElement;
458   char *p;
459
460        ciXml->errorCode = CIXML_ERROR_OK;
461        ciXml->recordElement = "record";
462   ciXml->mfnAttribute = "mfn";
463   ciXml->fieldElement = "field";
464   ciXml->tagAttribute = "tag";
465   ciXml->nameAttribute = "name";
466   ciXml->occElement = "occ";
467   ciXml->subfieldElement = "subfield";
468   ciXml->idAttribute = "id";
469   ciXml->style = default_style;
470   memset(&(ciXml->fnt),0x00,sizeof(EFC_SPLIT_LINES));
471   memset(&(ciXml->i2x),0x00,sizeof(FIELD_ELEMENT_LIST));
472   ciXml->p = NULL;
473
474        if ( efc_split_lines(&(ciXml->fnt),i2x) < 0L )
475   {
476        return ciXmlError(ciXml,CIXML_ERROR_ALLOC);
477   }
478
479   if ( ciXml->fnt.qtt )
480   {
481                ciXml->i2x.list = (FIELD_ELEMENT *)efc_new( (size_t)(sizeof(FIELD_ELEMENT) * ciXml->fnt.qtt) );
482        if ( !ciXml->i2x.list )
483           {
484                return ciXmlError(ciXml,CIXML_ERROR_ALLOC);
485           }
486   }
487
488        for (line = 0; line < ciXml->fnt.qtt; line++)
489   {
490
491        if ( strncmp(ciXml->fnt.list[line].text,"root=",5) == 0 )
492      {
493        ciXml->recordElement = ciXml->fnt.list[line].text+5;
494         continue;
495      }
496
497        if ( strncmp(ciXml->fnt.list[line].text,"record=",7) == 0 )
498      {
499        ciXml->recordElement = ciXml->fnt.list[line].text+7;
500         continue;
501      }
502
503        if ( strncmp(ciXml->fnt.list[line].text,"mfn=",4) == 0 )
504      {
505        ciXml->mfnAttribute = ciXml->fnt.list[line].text+4;
506         continue;
507      }
508
509        if ( strncmp(ciXml->fnt.list[line].text,"field=",6) == 0 )
510      {
511        ciXml->fieldElement = ciXml->fnt.list[line].text+6;
512         continue;
513      }
514
515        if ( strncmp(ciXml->fnt.list[line].text,"tag=",4) == 0 )
516      {
517        ciXml->tagAttribute = ciXml->fnt.list[line].text+4;
518         continue;
519      }
520
521        if ( strncmp(ciXml->fnt.list[line].text,"name=",5) == 0 )
522      {
523        ciXml->nameAttribute = ciXml->fnt.list[line].text+5;
524         continue;
525      }
526
527        if ( strncmp(ciXml->fnt.list[line].text,"occ=",4) == 0 )
528      {
529        ciXml->occElement = ciXml->fnt.list[line].text+4;
530         continue;
531      }
532
533        if ( strncmp(ciXml->fnt.list[line].text,"subfield=",9) == 0 )
534      {
535        ciXml->subfieldElement = ciXml->fnt.list[line].text+9;
536         continue;
537      }
538
539        if ( strncmp(ciXml->fnt.list[line].text,"id=",3) == 0 )
540      {
541        ciXml->idAttribute = ciXml->fnt.list[line].text+3;
542         continue;
543      }
544
545        if ( strncmp(ciXml->fnt.list[line].text,"style=",6) == 0 )
546      {
547                if ( strcmp(ciXml->fnt.list[line].text+6,"generic") == 0 )
548           {
549                ciXml->style = CIXML_STYLE_GENERIC;
550              }
551                if ( strcmp(ciXml->fnt.list[line].text+6,"full") == 0 )
552           {
553                ciXml->style = CIXML_STYLE_FULL;
554              }
555                if ( strcmp(ciXml->fnt.list[line].text+6,"specified") == 0 )
556           {
557                ciXml->style = CIXML_STYLE_SPECIFIED;
558              }
559                if ( strcmp(ciXml->fnt.list[line].text+6,"old-fixed") == 0  ||
560                          strcmp(ciXml->fnt.list[line].text+6,"edit") == 0 )
561           {
562                ciXml->style = CIXML_STYLE_FIXED_NOSF;
563              }
564                if ( strcmp(ciXml->fnt.list[line].text+6,"all") == 0 )
565           {
566                ciXml->style = CIXML_STYLE_ALL;
567              }
568                if ( strcmp(ciXml->fnt.list[line].text+6,"fixed") == 0 )
569           {
570                ciXml->style = CIXML_STYLE_FIXED;
571              }
572                continue;
573      }
574
575                auxFieldElement = &(ciXml->i2x.list[ciXml->i2x.qtt]);
576                auxFieldElement->tag = atoi(ciXml->fnt.list[line].text);
577      for ( p = ciXml->fnt.list[line].text; isdigit(*p); p++);
578                if ( *p == '^' )
579      {
580                        auxFieldElement->subfield = *++p;
581         p++;
582      }
583      else
584      {
585        auxFieldElement->subfield = '\0';
586      }
587      for ( ; *p == ' '; p++);
588                auxFieldElement->name = p;
589      ciXml->i2x.qtt++;
590
591   }
592
593   return ciXmlError(ciXml,CIXML_ERROR_OK);
594}
595
596/* ---------------------------------------------------------------- cixmlRun */
597void cixmlRun
598(
599        RECSTRU *recp,
600   CIXML_STRUCT *ciXml,
601   char *outputBuffer
602)
603{
604        ciXml->p = outputBuffer;
605
606        sprintf(ciXml->p,"<%s %s=\"%ld\">\n",ciXml->recordElement,ciXml->mfnAttribute,MFRmfn);
607   ciXml->p += strlen(ciXml->p);
608   fieldsXML(recp,ciXml);
609        sprintf(ciXml->p,"</%s>\n",ciXml->recordElement);
610   ciXml->p += strlen(ciXml->p);
611}
612
613/* --------------------------------------------------------------- cixmlFree */
614void cixmlFree
615(
616   CIXML_STRUCT *ciXml
617)
618{
619        efc_free(ciXml->i2x.list);
620        efc_split_lines_free(&(ciXml->fnt));
621}
Note: See TracBrowser for help on using the browser.