1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-09 13:22:24 +03:00

0026573: IGES file with one entity 128 is not read

Add some workaround to read IGES files with lines, which lengths are less than standard 80.

Test case for issue CR26573

Correction of test cases for issue CR26573

Correction of test case for issue CR26573
This commit is contained in:
ika
2015-09-03 14:58:25 +03:00
committed by bugmaster
parent 4b0cab06c1
commit a849d42d32
5 changed files with 108 additions and 55 deletions

View File

@@ -70,13 +70,13 @@ int igesread (char* nomfic, int lesect[6], int modefnes)
for(;;) {
numl ++;
i = iges_lire(lefic,&numsec,ligne,modefnes);
if (i <= 0) {
if (i <= 0 || i < i0) {
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]); */
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;
@@ -98,21 +98,21 @@ int igesread (char* nomfic, int lesect[6], int modefnes)
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 (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;
iges_param(&Pstat,ligne,c_separ,c_fin,64);
if (Pstat != 2) break;
}
}
}

View File

@@ -67,10 +67,7 @@ int iges_lire (FILE* lefic, int *numsec, char ligne[100], int modefnes)
while ( fgets ( ligne, 2, lefic ) && ( ligne[0] == '\r' || ligne[0] == '\n' ) )
{
}
fgets(&ligne[1],80,lefic);
/* fgets(ligne,81,lefic); */
fgets(&ligne[1],80,lefic);
}
}
@@ -96,42 +93,66 @@ int iges_lire (FILE* lefic, int *numsec, char ligne[100], int modefnes)
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]='.';
}
if (!sscanf(&ligne[73],"%d",&result) == 0) {
*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); */
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 :;
}
/* the column 72 is empty, try to check the neighbour*/
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 :;
}
}
}
// the line is not conform to standard, try to read it (if there are some missing spaces)
// find the number end
i = (int)strlen(ligne);
while ((ligne[i] == '\0' || ligne[i] == '\n' || ligne[i] == '\r' || ligne[i] == ' ') && i > 0)
i--;
if (i != (int)strlen(ligne))
ligne[i + 1] = '\0';
// find the number start
while (ligne[i] >= '0' && ligne[i] <= '9' && i > 0)
i--;
if (sscanf(&ligne[i + 1],"%d",&result) == 0)
return -1;
*numsec = result;
// find type of line
while (ligne[i] == ' ' && i > 0)
i--;
typesec = ligne[i];
switch (typesec) {
case 'S' : ligne[i] = '\0'; return (1);
case 'G' : ligne[i] = '\0'; return (2);
case 'D' : ligne[i] = '\0'; return (3);
case 'P' : ligne[i] = '\0'; return (4);
case 'T' : ligne[i] = '\0'; return (5);
default :; /* printf("Ligne incorrecte, ignoree n0.%d :\n%s\n",*numl,ligne); */
}
return -1;
}