void iges_param(int * Pstat,char * ligne, char c_separ,char c_fin,int lonlin) { int i,i0,j; char param[80]; char unpar; if (*Pstat == 0) reste = 0; if (*Pstat != 2) numcar = 0; if (*Pstat < 3) nbcarH = 0; else { numcar = nbcarH; if (numcar > lonlin) { iges_addparam(lonlin,ligne); nbcarH -= lonlin; /* ??? enregistrer ... ??? */ return; } else { iges_addparam(nbcarH,ligne); nbcarH = 0; } } i0 = 0; /* debut param utile (apres blancs eventuels), par defaut a 0 */ typarg = ArgVide; for (i = 0; (unpar = ligne[numcar+i]) != '\0'; i ++) { if (unpar == c_separ) { *Pstat = 2; param[i] = '\0'; #ifdef VERIFPRINT printf("numcar = %d type %d param: %s ",numcar,typarg,¶m[i0]); #endif if (reste == 0) iges_newparam(typarg,i-i0+1,¶m[i0]); else if (reste > 0) iges_addparam(i-i0+1,¶m[i0]); reste = 0; for (j = i+1; (unpar = ligne[numcar+j]) != '\0'; j++) { if (unpar != ' ') { numcar += i+1; return; } } *Pstat = 1; return; } if (unpar == c_fin) { *Pstat = 1; param[i] = '\0'; #ifdef VERIFPRINT printf("numcar = %d type %d param: %s ",numcar,typarg,¶m[i0]); #endif if (reste == 0) iges_newparam(typarg,i-i0+1,¶m[i0]); else if (reste > 0) iges_addparam(i-i0+1,¶m[i0]); reste = 0; return; } param[i] = unpar; /* Type du parametre ? */ if (unpar > 47 && unpar < 58) { if (typarg == ArgInt) continue; if (typarg == ArgVide) typarg = ArgInt; else if (typarg == ArgExp) typarg = ArgRexp; } else if (unpar == '+' || unpar == '-') { if (typarg == ArgVide) typarg = ArgSign; else if (typarg != ArgExp && typarg != ArgMexp) typarg = ArgQuid; } else if (unpar == '.') { if (typarg == ArgVide) typarg = ArgReal; else if (typarg == ArgInt || typarg == ArgSign) typarg = ArgReal; else typarg = ArgQuid; } else if (unpar == 'E' || unpar == 'e' || unpar == 'D' || unpar == 'd') { if (typarg == ArgReal) typarg = ArgExp; else if (typarg == ArgInt || typarg == ArgSign) typarg = ArgMexp; else typarg = ArgQuid; } else if (unpar == 'H') { /* format Hollerith ? */ if (typarg != ArgInt) { typarg = ArgQuid; continue; } typarg = ArgChar; nbcarH = 0; for (j = i0; j < i; j++) { if (param[j] > 47 && param[j] < 58) nbcarH = nbcarH*10 + (param[j]-48); else { nbcarH = 0; break; } } if (numcar+i+nbcarH >= lonlin) { /* texte a cheval sur +ieurs lignes */ for (j = 1; j < lonlin-numcar-i; j++) param[i+j] = ligne[numcar+i+j]; param[lonlin-numcar] = '\0'; nbcarH = (numcar+i +nbcarH+1 -lonlin); *Pstat =3; #ifdef VERIFPRINT printf("numcar = %d param: %s ",numcar,param); #endif iges_newparam(typarg,lonlin-i0,¶m[i0]); reste = 1; return; } else { for (j = 1; j <= nbcarH; j++) param[i+j] = ligne[numcar+i+j]; i += nbcarH; } } /* blanc : leading (facile) ou trailing (chercher la suite), sinon mauvais */ else if (unpar == ' ') { if (typarg == ArgVide) i0 = i+1; else { for (j = i+1; (unpar = ligne[numcar+j]) != '\0' ; j ++) { if (unpar == c_separ || unpar == c_fin) break; if (unpar != ' ') { typarg = ArgQuid; break; } } } } else typarg = ArgQuid; /* caractere non reconnu */ } /* Ici, fin de ligne sans separateur : noter parametre en cours ! */ *Pstat = 1; param[i] = '\0'; reste = -1; #ifdef VERIFPRINT printf ("Fin de ligne sans separateur, numcar,i : %d %d\n",numcar,i); if (i > i0) printf("numcar = %d type %d param: %s ",numcar,typarg,¶m[i0]); #endif if (i > i0) iges_newparam(typarg,i-i0+1,¶m[i0]); }
int igesread (char* nomfic, int lesect[6], int modefnes) { /* MGE 16/06/98 */ FILE* lefic; char ligne[100]; int numsec, numl; int i; int i0;int j; char str[2]; int Dstat = 0; int Pstat = 0; char c_separ = ','; char c_fin = ';'; iges_initfile(); lefic = stdin; i0 = numsec = 0; numl = 0; if (nomfic[1] != '\0') lefic = fopen(nomfic,"r"); if (lefic == NULL) return -1; /* fichier pas pu etre ouvert */ for (i = 1; i < 6; i++) lesect[i] = 0; for (j = 0; j < 100; j++) ligne[j] = 0; for(;;) { numl ++; i = iges_lire(lefic,&numsec,ligne,modefnes); if (i <= 0) { if (i == 0) break; /* Sending of message : Syntax error */ { str[1] = '\0'; str[0] = sects[i0]; IGESFile_Check2 (0,"XSTEP_18",numl,str); /* //gka 15 Sep 98: str instead of sects[i0]); */ } if (i0 == 0) return -1; lesect[i0] ++; continue; } lesect[i] ++; i0 = i; if (numsec != lesect[i]) { /* Sending of message : Syntax error */ str[1] = '\0'; str[0] = sects[i0]; IGESFile_Check2 (0,"XSTEP_19",numl,str); /* //gka 15 Sep 98: str instead of sects[i0]); */ } if (i == 1) { /* Start Section (comm.) */ ligne[72] = '\0'; iges_newparam (0,72,ligne); } if (i == 2) { /* Header (Global sect) */ iges_setglobal(); for (;;) { if (lesect[i] == 1) { /* Separation specifique */ int n0 = 0; if (ligne[0] != ',') { c_separ = ligne[2]; n0 = 3; } if (ligne[n0+1] != c_separ) { c_fin = ligne[n0+3]; } } iges_param(&Pstat,ligne,c_separ,c_fin,72); if (Pstat != 2) break; } } if (i == 3) iges_Dsect(&Dstat,numsec,ligne); /* Directory (Dsect) */ if (i == 4) { /* Parametres (Psect) */ iges_Psect(numsec,ligne); for (;;) { iges_param(&Pstat,ligne,c_separ,c_fin,64); if (Pstat != 2) break; } } } /* Sending of message : No Terminal Section */ if (lesect[5] == 0) { IGESFile_Check3 (1, "XSTEP_20"); //return -1; } fclose (lefic); return 0; }