b311480e |
1 | /* |
973c2be1 |
2 | Copyright (c) 1999-2014 OPEN CASCADE SAS |
b311480e |
3 | |
973c2be1 |
4 | This file is part of Open CASCADE Technology software library. |
b311480e |
5 | |
d5f74e42 |
6 | This library is free software; you can redistribute it and/or modify it under |
7 | the terms of the GNU Lesser General Public License version 2.1 as published |
973c2be1 |
8 | by the Free Software Foundation, with special exception defined in the file |
9 | OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT |
10 | distribution for complete text of the license and disclaimer of any warranty. |
b311480e |
11 | |
973c2be1 |
12 | Alternatively, this file may be used under the terms of Open CASCADE |
13 | commercial license or contractual agreement. |
b311480e |
14 | */ |
15 | |
7fd59977 |
16 | #include "igesread.h" |
17 | #include <string.h> |
18 | /* Routine de base de lecture d'un fichier IGES |
19 | |
20 | Cette routine lit une ligne, sauf si le statut "relire sur place" est mis |
21 | (utilise pour changement de section) : il est reannule ensuite |
22 | |
23 | Cette routine retourne : |
24 | - statut (retour fonction) : no de section : S,G,D,P,T (car 73) ou |
25 | 0 (EOF) ou -1 (tacher de sauter) ou -2 (car. 73 faux) |
26 | - un numero de ligne dans la section (car. 74 a 80) |
27 | - la ligne tronquee a 72 caracteres (0 binaire dans le 73ieme) |
28 | Il faut lui fournir (buffer) une ligne reservee a 81 caracteres |
29 | |
30 | Cas d erreur : ligne fausse des le debut -> abandon. Sinon tacher d enjamber |
31 | */ |
32 | |
33 | static int iges_fautrelire = 0; |
34 | int iges_lire (FILE* lefic, int *numsec, char ligne[100], int modefnes) |
35 | /*int iges_lire (lefic,numsec,ligne,modefnes)*/ |
36 | /*FILE* lefic; int *numsec; char ligne[100]; int modefnes;*/ |
37 | { |
38 | int i,result; char typesec; |
39 | /* int length;*/ |
22835705 |
40 | if (iges_fautrelire == 0) |
41 | { |
42 | if (*numsec == 0) |
43 | ligne[72] = ligne[79] = ' '; |
44 | |
7fd59977 |
45 | ligne[0] = '\0'; |
22835705 |
46 | if(modefnes) |
98160038 |
47 | { |
48 | if (fgets(ligne,99,lefic) == NULL) /*for kept compatibility with fnes*/ |
49 | return 0; |
50 | } |
22835705 |
51 | else |
52 | { |
7fd59977 |
53 | /* PTV: 21.03.2002 it is neccessary for files that have only `\r` but no `\n` |
54 | examle file is 919-001-T02-04-CP-VL.iges */ |
22835705 |
55 | while ( fgets ( ligne, 2, lefic ) && ( ligne[0] == '\r' || ligne[0] == '\n' ) ) |
56 | { |
57 | } |
58 | |
98160038 |
59 | if (fgets(&ligne[1],80,lefic) == NULL) |
60 | return 0; |
7fd59977 |
61 | } |
22835705 |
62 | |
63 | if (*numsec == 0 && ligne[72] != 'S' && ligne[79] == ' ') |
64 | {/* ON A DU FNES : Sauter la 1re ligne */ |
65 | ligne[0] = '\0'; |
66 | |
67 | if(modefnes) |
98160038 |
68 | { |
69 | if (fgets(ligne,99,lefic) == NULL) /*for kept compatibility with fnes*/ |
70 | return 0; |
71 | } |
22835705 |
72 | else |
73 | { |
74 | while ( fgets ( ligne, 2, lefic ) && ( ligne[0] == '\r' || ligne[0] == '\n' ) ) |
75 | { |
76 | } |
98160038 |
77 | if (fgets(&ligne[1],80,lefic) == NULL) |
78 | return 0; |
7fd59977 |
79 | } |
80 | } |
22835705 |
81 | |
82 | if ((ligne[0] & 128) && modefnes) |
83 | { |
008aef40 |
84 | for (i = 0; i < 80; i ++) |
85 | ligne[i] = (char)(ligne[i] ^ (150 + (i & 3))); |
7fd59977 |
86 | } |
87 | } |
22835705 |
88 | |
89 | if (feof(lefic)) |
90 | return 0; |
91 | |
92 | {//0x1A is END_OF_FILE for OS DOS and WINDOWS. For other OS we set this rule forcefully. |
93 | char *fc = strchr(ligne, 0x1A); |
94 | if(fc != 0) |
95 | { |
96 | fc[0] = '\0'; |
97 | return 0; |
98 | } |
99 | } |
100 | |
7fd59977 |
101 | iges_fautrelire = 0; |
102 | if (ligne[0] == '\0' || ligne[0] == '\n' || ligne[0] == '\r') |
103 | return iges_lire(lefic,numsec,ligne,modefnes); /* 0 */ |
a849d42d |
104 | |
eeec0986 |
105 | if (sscanf(&ligne[73],"%d",&result) != 0) { |
a849d42d |
106 | *numsec = result; |
7fd59977 |
107 | typesec = ligne[72]; |
108 | switch (typesec) { |
a849d42d |
109 | case 'S' : ligne[72] = '\0'; return (1); |
110 | case 'G' : ligne[72] = '\0'; return (2); |
111 | case 'D' : ligne[72] = '\0'; return (3); |
112 | case 'P' : ligne[72] = '\0'; return (4); |
113 | case 'T' : ligne[72] = '\0'; return (5); |
114 | default :; |
115 | } |
116 | /* the column 72 is empty, try to check the neighbour*/ |
117 | if(strlen(ligne)==80 |
118 | && (ligne[79]=='\n' || ligne[79]=='\r') && (ligne[0]<='9' && ligne[0]>='0')) { |
119 | /*check if the case of losted .*/ |
120 | int index; |
121 | for(index = 1; ligne[index]<='9' && ligne[index]>='0'; index++); |
122 | if (ligne[index]=='D' || ligne[index]=='d') { |
123 | for(index = 79; index > 0; index--) |
124 | ligne[index] = ligne[index-1]; |
125 | ligne[0]='.'; |
126 | } |
127 | typesec = ligne[72]; |
128 | switch (typesec) { |
129 | case 'S' : ligne[72] = '\0'; return (1); |
130 | case 'G' : ligne[72] = '\0'; return (2); |
131 | case 'D' : ligne[72] = '\0'; return (3); |
132 | case 'P' : ligne[72] = '\0'; return (4); |
133 | case 'T' : ligne[72] = '\0'; return (5); |
134 | default :; |
135 | } |
7fd59977 |
136 | } |
137 | } |
138 | |
a849d42d |
139 | // the line is not conform to standard, try to read it (if there are some missing spaces) |
140 | // find the number end |
141 | i = (int)strlen(ligne); |
142 | while ((ligne[i] == '\0' || ligne[i] == '\n' || ligne[i] == '\r' || ligne[i] == ' ') && i > 0) |
143 | i--; |
144 | if (i != (int)strlen(ligne)) |
145 | ligne[i + 1] = '\0'; |
146 | // find the number start |
147 | while (ligne[i] >= '0' && ligne[i] <= '9' && i > 0) |
148 | i--; |
149 | if (sscanf(&ligne[i + 1],"%d",&result) == 0) |
150 | return -1; |
151 | *numsec = result; |
152 | // find type of line |
153 | while (ligne[i] == ' ' && i > 0) |
154 | i--; |
155 | typesec = ligne[i]; |
156 | switch (typesec) { |
157 | case 'S' : ligne[i] = '\0'; return (1); |
158 | case 'G' : ligne[i] = '\0'; return (2); |
159 | case 'D' : ligne[i] = '\0'; return (3); |
160 | case 'P' : ligne[i] = '\0'; return (4); |
161 | case 'T' : ligne[i] = '\0'; return (5); |
162 | default :; /* printf("Ligne incorrecte, ignoree n0.%d :\n%s\n",*numl,ligne); */ |
163 | } |
7fd59977 |
164 | return -1; |
165 | } |
166 | |
167 | /* Pour commander la relecture sur place */ |
168 | |
169 | void iges_arelire() |
170 | { iges_fautrelire = 1; } |