6 /* Structures temporaires IGES (enregistrement des entites et parametres)
7 Comprennent : les declarations, et la gestion de l'entite en cours */
12 /* Liste de parametres IGES (header ou current part) */
13 static struct parlist *curlist;
14 static struct parlist *starts; /* Start Section du fichier IGES */
15 static struct parlist *header; /* Entete du fichier IGES */
18 /* Declaration d'une portion de Directory IGES */
19 static struct dirpart *curp;
21 struct dirpart *iges_get_curp (void)
26 /* Declaration d'un parametre IGES (Psect) */
27 static struct oneparam {
28 struct oneparam *next;
34 static struct dirpage {
37 struct dirpart parts[Maxparts];
41 static struct parpage { /* une page de parametres ; cf AddParam */
44 struct oneparam params[Maxpar+1];
48 static int curnumpart = 0;
49 static struct dirpage *curpage;
52 /* ROUTINES UTILITAIRES de traitement des textes (char*) */
54 /* Gestion du texte courant : c'est un texte alloue dynamiquement
55 iges_newchar en alloue un (jete le precedent alloue si pas lu)
56 rec_gettext lit le texte en cours, qui ne sera pas desalloue ensuite
57 rec_settext en force un autre en jetant le precedent (idem rec_newtext)
58 tandis que rec_newtext alloue un texte, sans lien avec le courant
63 static struct carpage {
64 struct carpage* next; /* chainage des pages de caracteres */
65 int used; /* place deja prise */
66 char cars[Maxcar+1]; /* page de caracteres */
69 static char* restext = NULL ; /* texte courant (allocation dynamique) */
70 /* static int resalloc = 0 ; */ /* alloue (memoire a liberer) ou non */
72 /* Utilitaire : Reservation de caracteres
73 Remplace suite de mini-malloc par gestion de page */
75 char* iges_newchar(newtext,lentext)
76 char* newtext; int lentext;
79 if ((lnt = onecarpage->used) > Maxcar-lentext-1) { /* allouer nouvelle page */
80 struct carpage *newpage;
81 unsigned int sizepage = sizeof(struct carpage);
82 if (lentext >= Maxcar) sizepage += (lentext+1 - Maxcar);
83 newpage = (struct carpage*) malloc (sizepage);
84 newpage->next = onecarpage;
86 lnt = onecarpage->used = 0;
88 restext = onecarpage->cars + lnt;
89 onecarpage->used = (lnt + lentext + 1);
91 for (i = lentext-1; i >= 0; i --) restext[i] = newtext[i];
92 restext[lentext] = '\0';
97 /* FICHIER IGES Proprement Dit */
99 /* Initialisation de l'enregistrement d'un fichier */
102 onecarpage = (struct carpage*) malloc ( sizeof(struct carpage) );
103 onecarpage->used = 0; onecarpage->next = NULL; restext = NULL;
104 oneparpage = (struct parpage*) malloc ( sizeof(struct parpage) );
105 oneparpage->used = 0; oneparpage->next = NULL;
107 starts = (struct parlist*) malloc ( sizeof(struct parlist) );
108 starts->first = starts->last = NULL; starts->nbparam = 0;
109 header = (struct parlist*) malloc ( sizeof(struct parlist) );
110 header->first = header->last = NULL; header->nbparam = 0;
112 curlist = starts; /* On commence a enregistrer la start section */
113 nbparts = nbparams = 0;
114 firstpage = (struct dirpage*) malloc ( sizeof(struct dirpage) );
115 firstpage->next = NULL; firstpage->used = 0;
119 /* Passage au Header (Global Section), lecture comme ecriture */
120 void iges_setglobal()
121 { if (curlist == header) return; curlist = header; curparam = curlist->first; }
124 /* Definition et Selection d'un nouveau dirpart */
126 void iges_newpart(numsec)
129 if (curpage->used >= Maxparts) {
130 struct dirpage* newpage;
131 newpage = (struct dirpage*) malloc ( sizeof(struct dirpage) );
132 newpage->next = NULL; newpage->used = 0;
133 curpage->next = newpage; curpage = newpage;
135 curnumpart = curpage->used;
136 curp = &(curpage->parts[curnumpart]);
137 curlist = &(curp->list);
138 curp->numpart = numsec; curlist->nbparam = 0;
139 curlist->first = curlist->last = NULL;
140 curpage->used ++; nbparts ++;
144 /* Selection du dirpart dnum, correspond a numsec en Psect */
146 void iges_curpart(numsec,dnum)
149 if (curp == NULL) return;
150 if (dnum == curp->numpart) return;
151 if (curnumpart < curpage->used - 1) curnumpart ++;
153 if (curpage->next == NULL) curpage = firstpage;
154 else curpage = curpage->next;
157 curp = &(curpage->parts[curnumpart]);
158 curlist = &(curp->list);
159 if (dnum == curp->numpart) return;
161 while (curpage != NULL) {
162 int i; int nbp = curpage->used;
163 for (i = 0; i < nbp; i ++) {
164 if (curpage->parts[i].numpart == dnum) {
166 curp = &(curpage->parts[i]);
167 curlist = &(curp->list);
171 curpage = curpage->next;
173 curp = NULL; /* pas trouve */
177 /* Definition d'un nouveau parametre */
178 /* (manque la gestion d'un Hollerith sur plusieurs lignes) */
180 /* longval : longueur de parval, incluant le zero final */
181 void iges_newparam(typarg,longval,parval)
182 int typarg,longval; char *parval;
185 if (curlist == NULL) return; /* non defini : abandon */
186 newval = iges_newchar(parval,longval);
187 /* curparam = (struct oneparam*) malloc ( sizeof(struct oneparam) ); */
188 if (oneparpage->used > Maxpar) {
189 struct parpage* newparpage;
190 newparpage = (struct parpage*) malloc ( sizeof(struct parpage) );
191 newparpage->next = oneparpage; newparpage->used = 0;
192 oneparpage = newparpage;
194 curparam = &(oneparpage->params[oneparpage->used]);
196 curparam->typarg = typarg;
197 curparam->parval = newval;
198 curparam->next = NULL;
199 if (curlist->first == NULL) curlist->first = curparam;
200 else curlist->last->next = curparam;
201 curlist->last = curparam;
206 /* Complement du parametre courant (cf Hollerith sur +ieurs lignes) */
207 void iges_addparam(longval,parval)
208 int longval; char* parval;
210 char *newval, *oldval; int i,long0;
211 if (longval <= 0) return;
212 oldval = curparam->parval;
213 long0 = strlen(oldval);
214 /* newval = (char*) malloc(long0+longval+1); */
215 newval = iges_newchar("",long0+longval+1);
216 for (i = 0; i < long0; i ++) newval[i] = oldval[i];
217 for (i = 0; i < longval; i ++) newval[i+long0] = parval[i];
218 newval[long0+longval] = '\0';
219 curparam->parval = newval;
223 /* Relecture : Initialiation */
224 /* entites relues par suite de lirpart + {lirparam}
225 lirparam initiaux : pour relire le demarrage (start section) */
226 void iges_stats(nbpart, nbparam)
227 int* nbpart; int* nbparam;
229 curpage = firstpage; curnumpart = 0;
231 curparam = curlist->first;
236 /* Lecture d'une part : retour = n0 section, 0 si fin */
238 (tabval, res1,res2,nom,num, nbparam)
240 int* *tabval; /* tableau recepteur des entiers (reserver 17 valeurs) */
241 char* *res1; char* *res2; char* *nom; char* *num; /* char : transmis a part */
244 if (curpage == NULL) return 0;
245 curp = &(curpage->parts[curnumpart]);
246 curlist = &(curp->list);
247 *nbparam = curlist->nbparam;
248 curparam = curlist->first;
249 *tabval = &(curp->typ); /* adresse de curp = adresse du tableau */
250 *res1 = curp->res1; *res2 = curp->res2;
251 *nom = curp->nom; *num = curp->num;
252 return curp->numpart;
255 /* Passage au suivant (une fois lus les parametres) */
259 if (curnumpart >= curpage->used) { /* attention, adressage de 0 a used-1 */
260 curpage = curpage->next;
265 /* Lecture parametre + passage au suivant */
266 int iges_lirparam(typarg,parval) /* renvoie 0 si fin de liste, 1 sinon */
267 int *typarg; char* *parval;
269 if (curparam == NULL) return 0;
270 *typarg = curparam->typarg;
271 *parval = curparam->parval;
272 curparam = curparam->next;
276 /* Fin pour ce fichier : liberer la place */
277 /* mode = 0 : tout; 1 : parametres; 2 : caracteres */
278 void iges_finfile(mode)
281 struct dirpage* oldpage;
282 if (mode == 0 || mode == 2) { free (starts); free (header); }
284 if (mode == 0 || mode == 1) {
286 while (curpage != NULL) {
287 oldpage = curpage->next;
292 while (oneparpage != NULL) {
293 struct parpage* oldparpage; oldparpage = oneparpage->next;
295 oneparpage = oldparpage;
299 if (mode == 0 || mode == 2) {
300 while (onecarpage != NULL) {
301 struct carpage* oldcarpage; oldcarpage = onecarpage->next;
303 onecarpage = oldcarpage;