From b99aa61ef9d08bc6227b3dc1393421e8b54322eb Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Thu, 12 Mar 2015 07:03:30 +0000 Subject: [PATCH] merge patch from tocket #260 to handle line continuations --- Geo/GModelIO_BDF.cpp | 101 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 80 insertions(+), 21 deletions(-) diff --git a/Geo/GModelIO_BDF.cpp b/Geo/GModelIO_BDF.cpp index 56d92a3861..330c45d6cf 100644 --- a/Geo/GModelIO_BDF.cpp +++ b/Geo/GModelIO_BDF.cpp @@ -103,7 +103,7 @@ static bool emptyFieldBDF(char *field, int length) static void readLineBDF(char *buffer, int format, std::vector<char*> &fields) { int cmax = (format == 2) ? 16 : 8; // max char per (center) field - int nmax = (format == 2) ? 4 : 8; // max num of (center) fields per line + int nmax = (format == 2) ? 4 : 8; // max num of (center) fields per line if(format == 0){ // free fields for(unsigned int i = 0; i < strlen(buffer); i++){ @@ -122,28 +122,86 @@ static int readElementBDF(FILE *fp, char *buffer, int keySize, int numVertices, int &num, int ®ion, std::vector<MVertex*> &vertices, std::map<int, MVertex*> &vertexMap) { - char buffer2[256], buffer3[256]; + fpos_t position; + char ch, buffer2[256], buffer3[256]; std::vector<char*> fields; + int nfields = 0, sizediff, j, c, cont; int format = getFormatBDF(buffer, keySize); - - for(unsigned int i = 0; i < sizeof(buffer2); i++) buffer2[i] = buffer3[i] = '\0'; - + + for(unsigned int i = 0; i < sizeof(buffer2); i++) + buffer2[i] = buffer3[i] = '\0'; + readLineBDF(buffer, format, fields); - - if(((int)fields.size() - 2 < abs(numVertices)) || - (numVertices < 0 && (fields.size() == 9))){ - if(fields.size() == 9) fields.pop_back(); - if(!fgets(buffer2, sizeof(buffer2), fp)) return 0; - readLineBDF(buffer2, format, fields); - } - - if(((int)fields.size() - 2 < abs(numVertices)) || - (numVertices < 0 && (fields.size() == 17))){ - if(fields.size() == 17) fields.pop_back(); - if(!fgets(buffer3, sizeof(buffer3), fp)) return 0; - readLineBDF(buffer3, format, fields); + sizediff = fields.size(); + + cont = 0; + while(!feof(fp)) { + if(format == 0){ // free field + // bail out if fixed number of vertices are found + if(numVertices > 0 && (int)fields.size() - 2 == numVertices) + break; + + // read next line to check for automatic continuation + fgetpos(fp, &position); + j = 0; + while(j < 8) { + ch = (char)fgetc(fp); + if(feof(fp) || ch != ' ') + break; + j++; + } + fsetpos(fp, &position); + + if(j != 7) + break; + } + else if(format == 1){ // small field + if(sizediff == 9){ + // normal continuation + fields.pop_back(); + } else if(sizediff == 8){ + // read next line to check for automatic continuation + c = fgetc(fp); + ch = (char)c; + if(feof(fp)) + break; + ungetc(c, fp); + if(ch != '*') + break; + } else { + break; + } + } + else if(format == 2){ // long field + if(sizediff == 5){ + // normal continuation + fields.pop_back(); + } else if(sizediff == 4){ + // read next line to check for automatic continuation + c = getc(fp); + ch = (char)c; + if(feof(fp)) + break; + ungetc(c, fp); + if(ch != '*') + break; + } else { + break; + } + } + // get continuation line + if(cont == 0) { + if(!fgets(buffer2, sizeof(buffer2), fp)) break; + nfields = fields.size(); + readLineBDF(buffer2, format, fields); + sizediff = fields.size() - nfields; + cont++; + } else { + if(!fgets(buffer3, sizeof(buffer3), fp)) break; + readLineBDF(buffer3, format, fields); + break; + } } - // negative 'numVertices' gives the minimum required number of vertices if((int)fields.size() - 2 < abs(numVertices)){ Msg::Error("Wrong number of vertices %d for element", fields.size() - 2); @@ -156,9 +214,10 @@ static int readElementBDF(FILE *fp, char *buffer, int keySize, int numVertices, strncpy(tmp, fields[0], cmax); num = atoi(tmp); strncpy(tmp, fields[1], cmax); region = atoi(tmp); for(unsigned int i = 2; i < fields.size(); i++){ - strncpy(tmp, fields[i], cmax); n[i - 2] = atoi(tmp); + strncpy(tmp, fields[i], cmax); + n[i - 2] = atoi(tmp); } - + // ignore the extra fields when we know how many vertices we need int numCheck = (numVertices > 0) ? numVertices : fields.size() - 2; -- GitLab