1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
#include "igesread.h"
#include <string.h>
/* Routine de base de lecture d'un fichier IGES
Cette routine lit une ligne, sauf si le statut "relire sur place" est mis
(utilise pour changement de section) : il est reannule ensuite
Cette routine retourne :
- statut (retour fonction) : no de section : S,G,D,P,T (car 73) ou
0 (EOF) ou -1 (tacher de sauter) ou -2 (car. 73 faux)
- un numero de ligne dans la section (car. 74 a 80)
- la ligne tronquee a 72 caracteres (0 binaire dans le 73ieme)
Il faut lui fournir (buffer) une ligne reservee a 81 caracteres
Cas d erreur : ligne fausse des le debut -> abandon. Sinon tacher d enjamber
*/
static int iges_fautrelire = 0;
int iges_lire (FILE* lefic, int *numsec, char ligne[100], int modefnes)
/*int iges_lire (lefic,numsec,ligne,modefnes)*/
/*FILE* lefic; int *numsec; char ligne[100]; int modefnes;*/
{
int i,result; char typesec;
/* int length;*/
if (iges_fautrelire == 0) {
if (*numsec == 0) ligne[72] = ligne[79] = ' ';
ligne[0] = '\0';
if(modefnes)
fgets(ligne,99,lefic); /*for kept compatibility with fnes*/
else {
/* PTV: 21.03.2002 it is neccessary for files that have only `\r` but no `\n`
examle file is 919-001-T02-04-CP-VL.iges */
while ( fgets ( ligne, 2, lefic ) && ( ligne[0] == '\r' || ligne[0] == '\n' ) )
{
}
fgets(&ligne[1],80,lefic);
/* fgets(ligne,81,lefic); */
}
if (*numsec == 0 && ligne[72] != 'S' && ligne[79] == ' ') {
/* ON A DU FNES : Sauter la 1re ligne */
ligne[0] = '\0';
if(modefnes)
fgets(ligne,99,lefic);/*for kept compatibility with fnes*/
else {
while ( fgets ( ligne, 2, lefic ) && ( ligne[0] == '\r' || ligne[0] == '\n' ) )
{
}
fgets(&ligne[1],80,lefic);
/* fgets(ligne,81,lefic); */
}
}
if ((ligne[0] & 128)&&modefnes) {
for (i = 0; i < 80; i ++) ligne[i] = ligne[i] ^ (150 + (i & 3));
}
}
if (feof(lefic)) return 0;
iges_fautrelire = 0;
if (ligne[0] == '\0' || ligne[0] == '\n' || ligne[0] == '\r')
return iges_lire(lefic,numsec,ligne,modefnes); /* 0 */
if (sscanf(&ligne[73],"%d",&result) == 0) return -1;
/* { printf("Erreur, ligne n0.%d :\n%s\n",*numl,ligne); return (*numsec > 0 ? -1 : -2); } */
*numsec = result;
typesec = ligne[72];
switch (typesec) {
case 'S' : ligne[72] = '\0'; return (1);
case 'G' : ligne[72] = '\0'; return (2);
case 'D' : ligne[72] = '\0'; return (3);
case 'P' : ligne[72] = '\0'; return (4);
case 'T' : ligne[72] = '\0'; return (5);
default :; /* printf("Ligne incorrecte, ignoree n0.%d :\n%s\n",*numl,ligne); */
}
/* the column 72 is empty, try to check the neghbour*/
if(strlen(ligne)==80
&& (ligne[79]=='\n' || ligne[79]=='\r') && (ligne[0]<='9' && ligne[0]>='0')) {
/*check if the case of losted .*/
int index;
for(index = 1; ligne[index]<='9' && ligne[index]>='0'; index++);
if (ligne[index]=='D' || ligne[index]=='d') {
for(index = 79; index > 0; index--)
ligne[index] = ligne[index-1];
ligne[0]='.';
}
typesec = ligne[72];
switch (typesec) {
case 'S' : ligne[72] = '\0'; return (1);
case 'G' : ligne[72] = '\0'; return (2);
case 'D' : ligne[72] = '\0'; return (3);
case 'P' : ligne[72] = '\0'; return (4);
case 'T' : ligne[72] = '\0'; return (5);
default :; /* printf("Ligne incorrecte, ignoree n0.%d :\n%s\n",*numl,ligne); */
}
}
return -1;
}
/* Pour commander la relecture sur place */
void iges_arelire()
{ iges_fautrelire = 1; }
|