diff --git a/Packages/Geomview/changes.txt b/Packages/Geomview/changes.txt index 9d6d6806d53..76bd44e0318 100644 --- a/Packages/Geomview/changes.txt +++ b/Packages/Geomview/changes.txt @@ -7,6 +7,9 @@ src/Geomview_stream.C CHANGES +Ver 2.8 (?? ??????? 00) +- Rewrote is_prefix() and nth() [syl]. + Ver 2.7 (13 janvier 00) undo the previous, and replace "ends" by "std::ends" diff --git a/Packages/Geomview/src/Geomview_stream.C b/Packages/Geomview/src/Geomview_stream.C index bc372551a78..4d320d9ab0f 100644 --- a/Packages/Geomview/src/Geomview_stream.C +++ b/Packages/Geomview/src/Geomview_stream.C @@ -1,6 +1,6 @@ // ============================================================================ // -// Copyright (c) 1999 The CGAL Consortium +// Copyright (c) 1999,2000 The CGAL Consortium // // This software and related documentation is part of an INTERNAL release // of the Computational Geometry Algorithms Library (CGAL). It is not @@ -28,6 +28,7 @@ #include #include +#include CGAL_BEGIN_NAMESPACE @@ -74,20 +75,20 @@ void Geomview_stream::setup_geomview(const char *machine, const char *login) // Communication between CGAL and geomview should be possible // in two directions. To achieve this we open two pipes - std::cout << "Starting Geomview..." << std::flush ; + std::cout << "Starting Geomview..." << std::flush; if (pipe(pipe_out) < 0) { - std::cerr << "out pipe failed" << std::endl ; + std::cerr << "out pipe failed" << std::endl; exit(-1); } if (pipe(pipe_in) < 0) { - std::cerr << "in pipe failed" << std::endl ; + std::cerr << "in pipe failed" << std::endl; exit(-1); } switch (pid = fork()){ case -1: - std::cerr << "fork failed" << std::endl ; + std::cerr << "fork failed" << std::endl; exit(-1); case 0: // The child process close(pipe_out[1]); // does not write to the out pipe, @@ -99,15 +100,14 @@ void Geomview_stream::setup_geomview(const char *machine, const char *login) dup(pipe_in[1]); // we connect it to the pipe if (machine && (strlen(machine)>0)) { std::ostrstream os; - os << " rgeomview " << machine << ":0.0" << std::ends ; - std::ostrstream logos; + os << " rgeomview " << machine << ":0.0" << std::ends; execlp("rsh", "rsh", machine, "-l", login, os.str(), (char *)0); } else { execlp("geomview", "geomview", "-c", "-", (char *)0); } // if we get to this point something went wrong. - std::cerr << "execl geomview failed" << std::endl ; + std::cerr << "execl geomview failed" << std::endl; switch(errno) { case EACCES: std::cerr << "please check your environment variable PATH" @@ -141,7 +141,7 @@ void Geomview_stream::setup_geomview(const char *machine, const char *login) segment_count = 0; point_count = 0; tetrahedron_count = 0; - (*this) << "(normalization g* none)(bbox-draw g* no)" ; + (*this) << "(normalization g* none)(bbox-draw g* no)"; break; } @@ -161,7 +161,7 @@ Geomview_stream::pickplane(const Bbox_3 &bbox) // close the text bracket << "}) (pickable pickplane no)" - << ascii ; + << ascii; } void @@ -314,7 +314,7 @@ Geomview_stream::operator<<(double d) } else { // 'copy' the float in a string and append a blank std::ostrstream str; - str << f << " " << std::ends ; + str << f << " " << std::ends; char *bptr = str.str(); ::write(out, bptr, int(strlen(bptr))); @@ -327,21 +327,21 @@ Geomview_stream& operator<<(Geomview_stream &gv, const Bbox_2 &bbox) { std::ostrstream os; - os << "bbox" << gv.bbox_count++ << std::ends ; + os << "bbox" << gv.bbox_count++ << std::ends; char *id = os.str(); gv << ascii - << "(geometry " << id << " {VECT 1 5 0 5 0 " ; + << "(geometry " << id << " {VECT 1 5 0 5 0 "; // here are the four corners gv << bbox.xmin() << bbox.ymin() << 0.0 << bbox.xmin() << bbox.ymax() << 0.0 << bbox.xmax() << bbox.ymax() << 0.0 << bbox.xmax() << bbox.ymin() << 0.0 - << bbox.xmin() << bbox.ymin() << 0.0 ; + << bbox.xmin() << bbox.ymin() << 0.0; // close the text bracket - gv << "})" ; + gv << "})"; return gv; } @@ -350,7 +350,7 @@ Geomview_stream& operator<<(Geomview_stream &gv, const Bbox_3 &bbox) { std::ostrstream os; - os << "bbox" << gv.bbox_count++ << std::ends ; + os << "bbox" << gv.bbox_count++ << std::ends; char *id = os.str(); gv << ascii @@ -372,7 +372,7 @@ operator<<(Geomview_stream &gv, const Bbox_3 &bbox) << "2 4 7\n" // close the text bracket - << "}})" ; + << "}})"; return gv; } @@ -496,7 +496,7 @@ Geomview_stream::frame(const Bbox_3 &bbox) { (*this) << bbox << ascii - << "(look-recenter g0 c0)(delete bbox0)" ; + << "(look-recenter g0 c0)(delete bbox0)"; } Geomview_stream& @@ -522,83 +522,55 @@ Geomview_stream::operator>>(char *expr) } i++; } - return *this ; + return *this; } +// Parse a Lisp expression, return a pointer to the beginning of the +// nth subexpression, and terminate it by '\0'. +// It's either a word terminated by ' ' or ')', or a well parenthesed +// expression, or a quoted "string". char* nth(char* s, int count) { - // int length = strlen(s); - - // the first character is always a parenthesis - int i = 1, // char count - wc = 0; // word count - - while (1) { - // skip whitespace - while(s[i]==' '){ - i++; - } - int j = 0; - int pcount = 1; - switch (s[i]){ - case '(': - j=i+1; - while (1) { - if ( s[j]==')' ) { - pcount--; - } else if (s[j]=='(' ) { - pcount++; - } - if ((pcount == 0 )&& (wc == count)) { - s[j+1] = '\0'; - return s + i; - } - j++; - } - i = j+1; - break; - case '"': - j = i+1; - while (1) { - if ( (s[j]=='"') && (wc == count) ) { - s[j+1] = '\0'; - return s + i; - } - j++; - } - i = j+1; - break; - default: - j=i+1; - while( ( s[j]!=' ' ) && ( s[j]!=')' ) ){ - j++; - } - if (wc == count){ - s[j] = '\0'; - return s + i; - } - i = j; - break; - } - wc++; + s++; // skip first character (always a parenthesis) + + // Skip "count" words. + for(; count != 0; count--) { + while (*s == ' ') // skip whitespaces + s++; + s++; + while (*s != ' ') // skip a word + s++; } - + while (*s == ' ') // skip whitespaces + s++; + + // Now we have the beginning of the searched sub-expression. + int j = 1; + if (*s == '(') // Case of a well-parenthesed expression. + for (int pcount = 1; pcount != 0;) { + if (s[j] == ')') pcount--; + if (s[j] == '(') pcount++; + j++; + } + else if (*s == '"') { // Case of a quoted "string". + while (s[j] != '"') + j++; + j++; + } + else // Case of a word terminated by ' ' or ')'. + while (s[j] != ' ' && s[j] != ')') + j++; + + s[j] = '\0'; return s; } +// Returns whether "p" is a prefix of "w". bool is_prefix(const char* p, const char* w) { - while((*p != '\0') && (*w != '\0')) - { - if(*p != *w) - return false; - ++p; - ++w; - } - - return ! ((*w == '\0') && (*p != '\0')); + return w == ::strstr(w, p); } CGAL_END_NAMESPACE