[brlcad-commits] SF.net SVN: brlcad:[39702] brlcad/trunk/src/libged/red.c
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <sta...@us...> - 2010-06-25 18:16:41
|
Revision: 39702 http://brlcad.svn.sourceforge.net/brlcad/?rev=39702&view=rev Author: starseeker Date: 2010-06-25 18:16:34 +0000 (Fri, 25 Jun 2010) Log Message: ----------- Take a somewhat different (hopefully cleaner) approach to handling the tmp file with red using bu_vls and friends Modified Paths: -------------- brlcad/trunk/src/libged/red.c Modified: brlcad/trunk/src/libged/red.c =================================================================== --- brlcad/trunk/src/libged/red.c 2010-06-25 16:12:05 UTC (rev 39701) +++ brlcad/trunk/src/libged/red.c 2010-06-25 18:16:34 UTC (rev 39702) @@ -108,16 +108,15 @@ FILE *fp; size_t node_count=0; int nonsubs=0; - int i, j, done, ch; - int done2, first; + int i, j, ch; + int first, scanning_tree; char relation; - char name_v4[NAMESIZE+1]; - char *name_v5=NULL; char *name=NULL; - char lineCopy[RT_MAXLINE] = {0}; char *ptr = (char *)NULL; struct bu_vls line; + struct bu_vls name_v5; bu_vls_init(&line); + bu_vls_init(&name_v5); if ((fp=fopen(_ged_tmpfil, "r")) == NULL) { perror("fopen"); @@ -125,116 +124,82 @@ return -1; } + scanning_tree = 0; + bu_vls_trunc(&line, 0); + while (bu_vls_gets(&line, fp) != -1) { - if (!strcmp(bu_vls_addr(&line), "combination tree:")) { - done2=0; - first=1; - ptr = strtok(bu_vls_addr(&line), _delims); - while (!done2) { - if (name_v5) { - bu_free(name_v5, "name_v5"); - name_v5 = NULL; - } - /* First non-white is the relation operator */ - if (!ptr) { - done2 = 1; - break; - } + if (!scanning_tree && strcmp(bu_vls_addr(&line), "combination tree:")) { + /* As long as we're not doing the tree, make sure there's an + * equal sign somewhere in the line so avs parsing will work + */ + ptr = strchr(&(bu_vls_addr(&line))[0], '='); + if (!ptr) { + bu_vls_printf(&gedp->ged_result_str, "Not a valid attribute/value pair: %s\n", bu_vls_addr(&line)); + fclose(fp); + bu_vls_free(&line); + bu_vls_free(&name_v5); + return -1; + } + bu_vls_trunc(&line, 0); + continue; + } else { + if (scanning_tree != 1) { + bu_vls_trunc(&line, 0); + bu_vls_gets(&line, fp); + scanning_tree = 1; + } + printf("into tree checking: %s\n", bu_vls_addr(&line)); - relation = (*ptr); - if (relation == '\0') { - if (first) - done = 1; + bu_vls_trimspace(&line); + if (bu_vls_strlen(&line) == 0) { + /* blank line, continue */ + continue; + } + + /* First non-white is the relation operator */ + relation = bu_vls_addr(&line)[0]; + printf("relation: %c\n", relation); + if (relation != '+' && relation != 'u' && relation != '-') { + bu_vls_printf(&gedp->ged_result_str, " %c is not a legal combination tree operator\n", relation); + fclose(fp); + bu_vls_free(&line); + bu_vls_free(&name_v5); + return -1; + } + if (relation != '-') + nonsubs++; - done2 = 1; - break; - } - first = 0; - - /* Next must be the member name */ - ptr = strtok((char *)NULL, _delims); - name = NULL; - if (ptr != NULL && *ptr != '\0') { - if (gedp->ged_wdbp->dbip->dbi_version < 5) { - bu_strlcpy(name_v4 , ptr , NAMESIZE+1); - - /* Eliminate trailing white space from name */ - j = NAMESIZE; - while (isspace(name_v4[--j])) - name_v4[j] = '\0'; - name = name_v4; - } else { - size_t len; - - len = strlen(ptr); - name_v5 = (char *)bu_malloc(len+1, "name_v5"); - bu_strlcpy(name_v5, ptr, len+1); - while (isspace(name_v5[len-1])) { - len--; - name_v5[len] = '\0'; - } - name = name_v5; - } - } - - if (relation != '+' && relation != 'u' && relation != '-') { - bu_vls_printf(&gedp->ged_result_str, " %c is not a legal operator\n", relation); - fclose(fp); - if (gedp->ged_wdbp->dbip->dbi_version >= 5 && name_v5) - bu_free(name_v5, "name_v5"); - return -1; - } - - if (relation != '-') - nonsubs++; - - if (name == NULL || name[0] == '\0') { - bu_vls_printf(&gedp->ged_result_str, " operand name missing\n%s\n", lineCopy); - fclose(fp); - if (gedp->ged_wdbp->dbip->dbi_version >= 5 && name_v5) - bu_free(name_v5, "name_v5"); - return -1; - } - - ptr = strtok((char *)NULL, _delims); - if (!ptr) - done2 = 1; - else if (*ptr != 'u' && - (*ptr != '-' || *(ptr+1) != '\0') && - (*ptr != '+' || *(ptr+1) != '\0')) { - int k; - - /* skip past matrix */ - for (k=1; k<16; k++) { - ptr = strtok((char *)NULL, _delims); - if (!ptr) { - bu_vls_printf(&gedp->ged_result_str, "incomplete matrix\n%s\n", lineCopy); - fclose(fp); - if (gedp->ged_wdbp->dbip->dbi_version >= 5 && name_v5) - bu_free(name_v5, "name_v5"); - return -1; - } - } - - /* get the next relational operator on the current line */ - ptr = strtok((char *)NULL, _delims); - } - - node_count++; + /* Next must be the member name */ + bu_vls_nibble(&line, 2); + ptr = strpbrk(&(bu_vls_addr(&line))[0], _delims); + if (!ptr && bu_vls_strlen(&line) != 0) ptr = bu_vls_addr(&line) + bu_vls_strlen(&line); + printf("pointers: %p, %p\n", bu_vls_addr(&line), ptr); + bu_vls_trunc(&name_v5, 0); + if (ptr != NULL && (bu_vls_addr(&line) - ptr != 0)) { + bu_vls_strncpy(&name_v5, bu_vls_addr(&line), ptr - bu_vls_addr(&line)); + printf("name: %s\n", bu_vls_addr(&name_v5)); + } else { + bu_vls_printf(&gedp->ged_result_str, " operand name missing\n%s\n", bu_vls_addr(&line)); + fclose(fp); + bu_vls_free(&line); + bu_vls_free(&name_v5); + return -1; } + node_count++; + bu_vls_trunc(&line, 0); } + } - if (gedp->ged_wdbp->dbip->dbi_version >= 5 && name_v5) - bu_free(name_v5, "name_v5"); + fclose(fp); + bu_vls_free(&line); + bu_vls_free(&name_v5); - fclose(fp); - - if (nonsubs == 0 && node_count) { - bu_vls_printf(&gedp->ged_result_str, "Cannot create a combination with all subtraction operators\n"); - return -1; - } - return node_count; + if (nonsubs == 0 && node_count) { + bu_vls_printf(&gedp->ged_result_str, "Cannot create a combination with all subtraction operators\n"); + return -1; } +/* return node_count;*/ +return -1; /* ensure check never passes until I get build_comb working CWY */ } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |