Revision: 76292 http://sourceforge.net/p/brlcad/code/76292 Author: starseeker Date: 2020-07-10 01:01:03 +0000 (Fri, 10 Jul 2020) Log Message: ----------- See if we can use dbi_fp and db_version to do the v4 write IFF we have a v4 .g file
Modified Paths: -------------- brlcad/trunk/src/libgcv/plugins/asc/asc_v4.cpp Modified: brlcad/trunk/src/libgcv/plugins/asc/asc_v4.cpp =================================================================== --- brlcad/trunk/src/libgcv/plugins/asc/asc_v4.cpp 2020-07-09 21:34:06 UTC (rev 76291) +++ brlcad/trunk/src/libgcv/plugins/asc/asc_v4.cpp 2020-07-10 01:01:03 UTC (rev 76292) @@ -1603,39 +1603,53 @@ } -/**************************************************************/ +/***************************************************************************/ +// v4 writing code requires a db4 .g file - the below code makes that +// assumption, and has not been modernized to write v4 asc files from newer +// data. Under most circumstances v4 asc files should not be needed, and +// the format does not support many newer BRL-CAD primitive types. +/***************************************************************************/ -// TODO - if I'm not mistaken, the v4 writing code requires -// a db4 .g file? It seems to be reading the file contents -// and processing them, rather than loading the .g normally -// and writing out data from in-memory structures. -// -// We definitely still need to read v4 - most of BRL-CAD's -// default examples are in that format. Do we still need -// to write it? If so, this pretty much needs a complete -// rewrite, unless we do some weird contortions to only -// allow callers to pair this with a db4 input (which really -// isn't in the spirit of gcv...) - CY +struct ascv4_wstate { + mat_t id_mat; /* identity matrix for pipes */ + union record record; /* GED database record */ + FILE *ifp; + FILE *ofp; +}; -/**************************************************************/ +static struct ascv4_wstate * +ascv4_wcreate() +{ + struct ascv4_wstate *s = NULL; + BU_GET(s, struct ascv4_wstate); + MAT_IDN(s->id_mat); + s->ifp = NULL; + s->ofp = NULL; + return s; +} -static int combdump(void); -static void idendump(void), polyhead_asc(void), polydata_asc(void); -static void soldump(void), extrdump(void), sketchdump(void); -static void membdump(union record *rp), arsadump(void), arsbdump(void); -static void materdump(void), bspldump(void), bsurfdump(void); -static void pipe_dump(void), particle_dump(void), dump_pipe_segs(char *, struct bu_list *); -static void arbn_dump(void), cline_dump(void), bot_dump(void); -static void nmg_dump(void); -static void strsol_dump(void); -static char * strchop(char *str, size_t len); +static void +ascv4_wdestroy(struct ascv4_wstate *s) +{ + if (s->ofp) { + fclose(s->ifp); + } + BU_PUT(s, struct ascv4_wstate); +} -const mat_t id_mat = MAT_INIT_IDN; /* identity matrix for pipes */ + +static int combdump(struct ascv4_wstate *); +static void idendump(struct ascv4_wstate *), polyhead_asc(struct ascv4_wstate *), polydata_asc(struct ascv4_wstate *); +static void soldump(struct ascv4_wstate *), extrdump(struct ascv4_wstate *), sketchdump(struct ascv4_wstate *); +static void membdump(struct ascv4_wstate *, union record *rp), arsadump(struct ascv4_wstate *), arsbdump(struct ascv4_wstate *); +static void materdump(struct ascv4_wstate *), bspldump(struct ascv4_wstate *), bsurfdump(struct ascv4_wstate *); +static void pipe_dump(struct ascv4_wstate *), particle_dump(struct ascv4_wstate *), dump_pipe_segs(struct ascv4_wstate *, char *, struct bu_list *); +static void arbn_dump(struct ascv4_wstate *), cline_dump(struct ascv4_wstate *), bot_dump(struct ascv4_wstate *); +static void nmg_dump(struct ascv4_wstate *); +static void strsol_dump(struct ascv4_wstate *); +static char * strchop(char *str, size_t len); #define CH(x) strchop(x, sizeof(x)) -union record record; /* GED database record */ -FILE *ifp; -FILE *ofp; /* * Take a database name and null-terminate it, @@ -1642,40 +1656,39 @@ * converting unprintable characters to something printable. * Here we deal with names not being null-terminated. */ -static char * -encode_name(char *str) +static void +encode_name(struct bu_vls *ostr, char *str) { - static char buf[NAMESIZE+1]; char *ip = str; - char *op = buf; int warn = 0; - while (op < &buf[NAMESIZE]) { + bu_vls_trunc(ostr, 0); + + size_t cnt = 0; + while (cnt < strlen(str)) { if (*ip == '\0') break; if (isprint((int)*ip) && !isspace((int)*ip)) { - *op++ = *ip++; + bu_vls_putc(ostr, *ip); + ip++; } else { - *op++ = '@'; + bu_vls_putc(ostr, '@'); ip++; warn = 1; } } - *op = '\0'; + if (warn) { fprintf(stderr, - "g2asc: Illegal char in object name, converted to '%s'\n", - buf); + "ascv4 write: Illegal char(s) in object name, converted to '%s'\n", + bu_vls_cstr(ostr)); } - if (op == buf) { + if (!bu_vls_strlen(ostr)) { /* Null input name */ fprintf(stderr, - "g2asc: NULL object name converted to -=NULL=-\n"); - - // TODO - // return "-=NULL=-"; - return NULL; + "ascv4 write: NULL object name converted to -=NULL=-\n"); + + bu_vls_sprintf(ostr, "-=NULL=-"); } - return buf; } @@ -1685,7 +1698,7 @@ * the remainder are read from ifp. */ static void -get_ext(struct bu_external *ep, size_t ngran) +get_ext(struct ascv4_wstate *s, struct bu_external *ep, size_t ngran) { size_t count; @@ -1695,11 +1708,11 @@ ep->ext_buf = (uint8_t *)bu_malloc(ep->ext_nbytes, "get_ext ext_buf"); /* Copy the freebie (first) record into the array of records. */ - memcpy((char *)ep->ext_buf, (char *)&record, sizeof(union record)); + memcpy((char *)ep->ext_buf, (char *)&s->record, sizeof(union record)); if (ngran <= 1) return; count = fread(((char *)ep->ext_buf)+sizeof(union record), - sizeof(union record), ngran-1, ifp); + sizeof(union record), ngran-1, s->ifp); if (count != (size_t)ngran-1) { fprintf(stderr, "g2asc: get_ext: wanted to read %lu granules, got %lu\n", @@ -1709,7 +1722,7 @@ } static void -nmg_dump(void) +nmg_dump(struct ascv4_wstate *s) { union record rec; long struct_count[26]; @@ -1724,29 +1737,29 @@ } /* get number of granules needed for this NMG */ - granules = ntohl(*(uint32_t *)record.nmg.N_count); + granules = ntohl(*(uint32_t *)s->record.nmg.N_count); /* get the array of structure counts */ for (j = 0; j < 26; j++) - struct_count[j] = ntohl(*(uint32_t *)&record.nmg.N_structs[j*4]); + struct_count[j] = ntohl(*(uint32_t *)&s->record.nmg.N_structs[j*4]); /* output some header info */ - fprintf(ofp, "%c %d %.16s %lu\n", - record.nmg.N_id, /* N */ - record.nmg.N_version, /* NMG version */ - record.nmg.N_name, /* solid name */ + fprintf(s->ofp, "%c %d %.16s %lu\n", + s->record.nmg.N_id, /* N */ + s->record.nmg.N_version, /* NMG version */ + s->record.nmg.N_name, /* solid name */ (unsigned long)granules); /* number of additional granules */ /* output the structure counts */ for (j = 0; j < 26; j++) - fprintf(ofp, " %ld", struct_count[j]); - (void)fputc('\n', ofp); + fprintf(s->ofp, " %ld", struct_count[j]); + (void)fputc('\n', s->ofp); /* dump the reminder in hex format */ for (i = 0; i < granules; i++) { char *cp; /* Read the record */ - if (!fread((char *)&rec, sizeof record, 1, ifp)) { + if (!fread((char *)&rec, sizeof s->record, 1, s->ifp)) { fprintf(stderr, "Error reading nmg granules\n"); bu_exit(-1, NULL); } @@ -1755,23 +1768,23 @@ /* 32 bytes per line */ for (k = 0; k < sizeof(union record)/32; k++) { for (j = 0; j < 32; j++) - fprintf(ofp, "%02x", (0xff & (*cp++))); /* two hex digits per byte */ - fputc('\n', ofp); + fprintf(s->ofp, "%02x", (0xff & (*cp++))); /* two hex digits per byte */ + fputc('\n', s->ofp); } } } static void -strsol_dump(void) /* print out strsol solid info */ +strsol_dump(struct ascv4_wstate *s) /* print out strsol solid info */ { union record rec[DB_SS_NGRAN]; char *cp; /* get all the strsol granules */ - rec[0] = record; /* struct copy the current record */ + rec[0] = s->record; /* struct copy the current record */ /* read the rest from ifp */ - if (!fread((char *)&rec[1], sizeof record, DB_SS_NGRAN-1, ifp)) + if (!fread((char *)&rec[1], sizeof s->record, DB_SS_NGRAN-1, s->ifp)) { fprintf(stderr, "Error reading strsol granules\n"); bu_exit(-1, NULL); @@ -1782,7 +1795,7 @@ cp += (sizeof(union record) - 1); *cp = '\0'; - fprintf(ofp, "%c %.16s %.16s %s\n", + fprintf(s->ofp, "%c %.16s %.16s %s\n", rec[0].ss.ss_id, /* s */ rec[0].ss.ss_keyword, /* "ebm", "vol", or ??? */ rec[0].ss.ss_name, /* solid name */ @@ -1791,71 +1804,77 @@ } static void -idendump(void) /* Print out Ident record information */ +idendump(struct ascv4_wstate *s) /* Print out Ident record information */ { - fprintf(ofp, "%c %d %.6s\n", - record.i.i_id, /* I */ - record.i.i_units, /* units */ - CH(record.i.i_version) /* version */ + fprintf(s->ofp, "%c %d %.6s\n", + s->record.i.i_id, /* I */ + s->record.i.i_units, /* units */ + CH(s->record.i.i_version) /* version */ ); - fprintf(ofp, "%.72s\n", - CH(record.i.i_title) /* title or description */ + fprintf(s->ofp, "%.72s\n", + CH(s->record.i.i_title) /* title or description */ ); /* Print a warning message on stderr if versions differ */ - if (!BU_STR_EQUAL(record.i.i_version, ID_VERSION)) { + if (!BU_STR_EQUAL(s->record.i.i_version, ID_VERSION)) { fprintf(stderr, "g2asc: File is version (%s), Program is version (%s)\n", - record.i.i_version, ID_VERSION); + s->record.i.i_version, ID_VERSION); } } static void -polyhead_asc(void) /* Print out Polyhead record information */ +polyhead_asc(struct ascv4_wstate *s) /* Print out Polyhead record information */ { - fprintf(ofp, "%c ", record.p.p_id); /* P */ - fprintf(ofp, "%.16s", encode_name(record.p.p_name)); /* unique name */ - fprintf(ofp, "\n"); /* Terminate w/ a newline */ + struct bu_vls ename = BU_VLS_INIT_ZERO; + encode_name(&ename, s->record.p.p_name); + fprintf(s->ofp, "%c ", s->record.p.p_id); /* P */ + fprintf(s->ofp, "%.16s", bu_vls_cstr(&ename)); /* unique name */ + fprintf(s->ofp, "\n"); /* Terminate w/ a newline */ + bu_vls_free(&ename); } static void -polydata_asc(void) /* Print out Polydata record information */ +polydata_asc(struct ascv4_wstate *s) /* Print out Polydata record information */ { int i, j; - fprintf(ofp, "%c ", record.q.q_id); /* Q */ - fprintf(ofp, "%d", record.q.q_count); /* # of vertices <= 5 */ + fprintf(s->ofp, "%c ", s->record.q.q_id); /* Q */ + fprintf(s->ofp, "%d", s->record.q.q_count); /* # of vertices <= 5 */ for (i = 0; i < 5; i++) { /* [5][3] vertices */ for (j = 0; j < 3; j++) { - fprintf(ofp, " %.12e", record.q.q_verts[i][j]); + fprintf(s->ofp, " %.12e", s->record.q.q_verts[i][j]); } } for (i = 0; i < 5; i++) { /* [5][3] normals */ for (j = 0; j < 3; j++) { - fprintf(ofp, " %.12e", record.q.q_norms[i][j]); + fprintf(s->ofp, " %.12e", s->record.q.q_norms[i][j]); } } - fprintf(ofp, "\n"); /* Terminate w/ a newline */ + fprintf(s->ofp, "\n"); /* Terminate w/ a newline */ } static void -soldump(void) /* Print out Solid record information */ +soldump(struct ascv4_wstate *s) /* Print out Solid record information */ { int i; - fprintf(ofp, "%c ", record.s.s_id); /* S */ - fprintf(ofp, "%d ", record.s.s_type); /* GED primitive type */ - fprintf(ofp, "%.16s ", encode_name(record.s.s_name)); /* unique name */ - fprintf(ofp, "%d", record.s.s_cgtype);/* COMGEOM solid type */ + fprintf(s->ofp, "%c ", s->record.s.s_id); /* S */ + fprintf(s->ofp, "%d ", s->record.s.s_type); /* GED primitive type */ + struct bu_vls ename = BU_VLS_INIT_ZERO; + encode_name(&ename, s->record.s.s_name); + fprintf(s->ofp, "%.16s ", bu_vls_cstr(&ename)); /* unique name */ + bu_vls_free(&ename); + fprintf(s->ofp, "%d", s->record.s.s_cgtype);/* COMGEOM solid type */ for (i = 0; i < 24; i++) - fprintf(ofp, " %.12e", record.s.s_values[i]); /* parameters */ - fprintf(ofp, "\n"); /* Terminate w/ a newline */ + fprintf(s->ofp, " %.12e", s->record.s.s_values[i]); /* parameters */ + fprintf(s->ofp, "\n"); /* Terminate w/ a newline */ } static void -cline_dump(void) +cline_dump(struct ascv4_wstate *s) { size_t ngranules; /* number of granules, total */ char *name; @@ -1863,14 +1882,14 @@ struct bu_external ext; struct rt_db_internal intern; - name = record.cli.cli_name; + name = s->record.cli.cli_name; ngranules = 1; - get_ext(&ext, ngranules); + get_ext(s, &ext, ngranules); /* Hand off to librt's import() routine */ RT_DB_INTERNAL_INIT(&intern); - if ((OBJ[ID_CLINE].ft_import4(&intern, &ext, id_mat, DBI_NULL, &rt_uniresource)) != 0) { + if ((OBJ[ID_CLINE].ft_import4(&intern, &ext, s->id_mat, DBI_NULL, &rt_uniresource)) != 0) { fprintf(stderr, "g2asc: cline import failure\n"); bu_exit(-1, NULL); } @@ -1878,12 +1897,12 @@ cli = (struct rt_cline_internal *)intern.idb_ptr; RT_CLINE_CK_MAGIC(cli); - fprintf(ofp, "%c ", DBID_CLINE); /* c */ - fprintf(ofp, "%.16s ", name); /* unique name */ - fprintf(ofp, "%26.20e %26.20e %26.20e ", V3ARGS(cli->v)); - fprintf(ofp, "%26.20e %26.20e %26.20e ", V3ARGS(cli->h)); - fprintf(ofp, "%26.20e %26.20e", cli->radius, cli->thickness); - fprintf(ofp, "\n"); /* Terminate w/ a newline */ + fprintf(s->ofp, "%c ", DBID_CLINE); /* c */ + fprintf(s->ofp, "%.16s ", name); /* unique name */ + fprintf(s->ofp, "%26.20e %26.20e %26.20e ", V3ARGS(cli->v)); + fprintf(s->ofp, "%26.20e %26.20e %26.20e ", V3ARGS(cli->h)); + fprintf(s->ofp, "%26.20e %26.20e", cli->radius, cli->thickness); + fprintf(s->ofp, "\n"); /* Terminate w/ a newline */ rt_db_free_internal(&intern); bu_free_external(&ext); @@ -1890,7 +1909,7 @@ } static void -bot_dump(void) +bot_dump(struct ascv4_wstate *s) { size_t ngranules; char *name; @@ -1899,13 +1918,13 @@ struct rt_db_internal intern; size_t i; - name = record.bot.bot_name; - ngranules = ntohl(*(uint32_t *)record.bot.bot_nrec) + 1; - get_ext(&ext, ngranules); + name = s->record.bot.bot_name; + ngranules = ntohl(*(uint32_t *)s->record.bot.bot_nrec) + 1; + get_ext(s, &ext, ngranules); /* Hand off to librt's import() routine */ RT_DB_INTERNAL_INIT(&intern); - if ((OBJ[ID_BOT].ft_import4(&intern, &ext, id_mat, DBI_NULL, &rt_uniresource)) != 0) { + if ((OBJ[ID_BOT].ft_import4(&intern, &ext, s->id_mat, DBI_NULL, &rt_uniresource)) != 0) { fprintf(stderr, "g2asc: bot import failure\n"); bu_exit(-1, NULL); } @@ -1913,28 +1932,28 @@ bot = (struct rt_bot_internal *)intern.idb_ptr; RT_BOT_CK_MAGIC(bot); - fprintf(ofp, "%c ", DBID_BOT); /* t */ - fprintf(ofp, "%.16s ", name); /* unique name */ - fprintf(ofp, "%d ", bot->mode); - fprintf(ofp, "%d ", bot->orientation); - fprintf(ofp, "%d ", 0); /* was error_mode */ - fprintf(ofp, "%lu ", (unsigned long)bot->num_vertices); - fprintf(ofp, "%lu", (unsigned long)bot->num_faces); - fprintf(ofp, "\n"); + fprintf(s->ofp, "%c ", DBID_BOT); /* t */ + fprintf(s->ofp, "%.16s ", name); /* unique name */ + fprintf(s->ofp, "%d ", bot->mode); + fprintf(s->ofp, "%d ", bot->orientation); + fprintf(s->ofp, "%d ", 0); /* was error_mode */ + fprintf(s->ofp, "%lu ", (unsigned long)bot->num_vertices); + fprintf(s->ofp, "%lu", (unsigned long)bot->num_faces); + fprintf(s->ofp, "\n"); for (i = 0; i < bot->num_vertices; i++) - fprintf(ofp, " %lu: %26.20e %26.20e %26.20e\n", (unsigned long)i, V3ARGS(&bot->vertices[i*3])); + fprintf(s->ofp, " %lu: %26.20e %26.20e %26.20e\n", (unsigned long)i, V3ARGS(&bot->vertices[i*3])); if (bot->mode == RT_BOT_PLATE) { struct bu_vls vls = BU_VLS_INIT_ZERO; for (i = 0; i < bot->num_faces; i++) - fprintf(ofp, " %lu: %d %d %d %26.20e\n", (unsigned long)i, V3ARGS(&bot->faces[i*3]), bot->thickness[i]); + fprintf(s->ofp, " %lu: %d %d %d %26.20e\n", (unsigned long)i, V3ARGS(&bot->faces[i*3]), bot->thickness[i]); bu_bitv_to_hex(&vls, bot->face_mode); - fprintf(ofp, " %s\n", bu_vls_addr(&vls)); + fprintf(s->ofp, " %s\n", bu_vls_addr(&vls)); bu_vls_free(&vls); } else { for (i = 0; i < bot->num_faces; i++) - fprintf(ofp, " %lu: %d %d %d\n", (unsigned long)i, V3ARGS(&bot->faces[i*3])); + fprintf(s->ofp, " %lu: %d %d %d\n", (unsigned long)i, V3ARGS(&bot->faces[i*3])); } rt_db_free_internal(&intern); @@ -1942,7 +1961,7 @@ } static void -pipe_dump(void) /* Print out Pipe record information */ +pipe_dump(struct ascv4_wstate *s) /* Print out Pipe record information */ { size_t ngranules; /* number of granules, total */ @@ -1951,14 +1970,14 @@ struct bu_external ext; struct rt_db_internal intern; - ngranules = ntohl(*(uint32_t *)record.pwr.pwr_count) + 1; - name = record.pwr.pwr_name; + ngranules = ntohl(*(uint32_t *)s->record.pwr.pwr_count) + 1; + name = s->record.pwr.pwr_name; - get_ext(&ext, ngranules); + get_ext(s, &ext, ngranules); /* Hand off to librt's import() routine */ RT_DB_INTERNAL_INIT(&intern); - if ((OBJ[ID_PIPE].ft_import4(&intern, &ext, id_mat, NULL, &rt_uniresource)) != 0) { + if ((OBJ[ID_PIPE].ft_import4(&intern, &ext, s->id_mat, NULL, &rt_uniresource)) != 0) { fprintf(stderr, "g2asc: pipe import failure\n"); bu_exit(-1, NULL); } @@ -1970,7 +1989,7 @@ * will print all the information. */ - dump_pipe_segs(name, &pipeip->pipe_segs_head); + dump_pipe_segs(s, name, &pipeip->pipe_segs_head); rt_db_free_internal(&intern); bu_free_external(&ext); @@ -1977,20 +1996,20 @@ } static void -dump_pipe_segs(char *name, struct bu_list *headp) +dump_pipe_segs(struct ascv4_wstate *s, char *name, struct bu_list *headp) { struct wdb_pipe_pnt *sp; - fprintf(ofp, "%c %.16s\n", DBID_PIPE, name); + fprintf(s->ofp, "%c %.16s\n", DBID_PIPE, name); /* print parameters for each point: one point per line */ for (BU_LIST_FOR(sp, wdb_pipe_pnt, headp)) { - fprintf(ofp, "%26.20e %26.20e %26.20e %26.20e %26.20e %26.20e\n", + fprintf(s->ofp, "%26.20e %26.20e %26.20e %26.20e %26.20e %26.20e\n", sp->pp_id, sp->pp_od, sp->pp_bendradius, V3ARGS(sp->pp_coord)); } - fprintf(ofp, "END_PIPE %s\n", name); + fprintf(s->ofp, "END_PIPE %s\n", name); } /* @@ -1998,17 +2017,17 @@ * Note that particles fit into one granule only. */ static void -particle_dump(void) +particle_dump(struct ascv4_wstate *s) { struct rt_part_internal *part; /* head for the structure */ struct bu_external ext; struct rt_db_internal intern; - get_ext(&ext, 1); + get_ext(s, &ext, 1); /* Hand off to librt's import() routine */ RT_DB_INTERNAL_INIT(&intern); - if ((OBJ[ID_PARTICLE].ft_import4(&intern, &ext, id_mat, NULL, &rt_uniresource)) != 0) { + if ((OBJ[ID_PARTICLE].ft_import4(&intern, &ext, s->id_mat, NULL, &rt_uniresource)) != 0) { fprintf(stderr, "g2asc: particle import failure\n"); bu_exit(-1, NULL); } @@ -2032,8 +2051,8 @@ bu_exit(-1, NULL); } - fprintf(ofp, "%c %.16s %26.20e %26.20e %26.20e %26.20e %26.20e %26.20e %26.20e %26.20e\n", - record.part.p_id, record.part.p_name, + fprintf(s->ofp, "%c %.16s %26.20e %26.20e %26.20e %26.20e %26.20e %26.20e %26.20e %26.20e\n", + s->record.part.p_id, s->record.part.p_name, part->part_V[X], part->part_V[Y], part->part_V[Z], @@ -2049,7 +2068,7 @@ * */ static void -arbn_dump(void) +arbn_dump(struct ascv4_wstate *s) { size_t ngranules; /* number of granules to be read */ size_t i; /* a counter */ @@ -2058,14 +2077,14 @@ struct bu_external ext; struct rt_db_internal intern; - ngranules = ntohl(*(uint32_t *)record.n.n_grans) + 1; - name = record.n.n_name; + ngranules = ntohl(*(uint32_t *)s->record.n.n_grans) + 1; + name = s->record.n.n_name; - get_ext(&ext, ngranules); + get_ext(s, &ext, ngranules); /* Hand off to librt's import() routine */ RT_DB_INTERNAL_INIT(&intern); - if ((OBJ[ID_ARBN].ft_import4(&intern, &ext, id_mat, NULL, &rt_uniresource)) != 0) { + if ((OBJ[ID_ARBN].ft_import4(&intern, &ext, s->id_mat, NULL, &rt_uniresource)) != 0) { fprintf(stderr, "g2asc: arbn import failure\n"); bu_exit(-1, NULL); } @@ -2073,9 +2092,9 @@ arbn = (struct rt_arbn_internal *)intern.idb_ptr; RT_ARBN_CK_MAGIC(arbn); - fprintf(ofp, "%c %.16s %lu\n", 'n', name, (unsigned long)arbn->neqn); + fprintf(s->ofp, "%c %.16s %lu\n", 'n', name, (unsigned long)arbn->neqn); for (i = 0; i < arbn->neqn; i++) { - fprintf(ofp, "n %26.20e %20.26e %26.20e %26.20e\n", + fprintf(s->ofp, "n %26.20e %20.26e %26.20e %26.20e\n", arbn->eqn[i][X], arbn->eqn[i][Y], arbn->eqn[i][Z], arbn->eqn[i][3]); } @@ -2095,7 +2114,7 @@ * 1 converted OK, left next record in global "record" for reuse. */ static int -combdump(void) /* Print out Combination record information */ +combdump(struct ascv4_wstate *s) /* Print out Combination record information */ { int m1, m2; /* material property flags */ struct bu_list head; @@ -2115,8 +2134,8 @@ mcount = 0; while (1) { BU_GET(mp, struct mchain); - if (fread((char *)&mp->r, sizeof(mp->r), 1, ifp) != 1 - || feof(ifp)) + if (fread((char *)&mp->r, sizeof(mp->r), 1, s->ifp) != 1 + || feof(s->ifp)) break; if (mp->r.u_id != ID_MEMB) { ret_mp = mp; /* Handle it later */ @@ -2129,73 +2148,76 @@ /* * Output the combination */ - fprintf(ofp, "%c ", record.c.c_id); /* C */ - switch (record.c.c_flags) { + fprintf(s->ofp, "%c ", s->record.c.c_id); /* C */ + switch (s->record.c.c_flags) { case DBV4_REGION: - fprintf(ofp, "Y "); /* Y if `R' */ + fprintf(s->ofp, "Y "); /* Y if `R' */ break; case DBV4_NON_REGION_NULL: case DBV4_NON_REGION: - fprintf(ofp, "N "); /* N if ` ' or '\0' */ + fprintf(s->ofp, "N "); /* N if ` ' or '\0' */ break; case DBV4_REGION_FASTGEN_PLATE: - fprintf(ofp, "P "); + fprintf(s->ofp, "P "); break; case DBV4_REGION_FASTGEN_VOLUME: - fprintf(ofp, "V "); + fprintf(s->ofp, "V "); break; } - fprintf(ofp, "%.16s ", encode_name(record.c.c_name)); /* unique name */ - fprintf(ofp, "%d ", record.c.c_regionid); /* region ID code */ - fprintf(ofp, "%d ", record.c.c_aircode); /* air space code */ + struct bu_vls ename = BU_VLS_INIT_ZERO; + encode_name(&ename, s->record.c.c_name); + fprintf(s->ofp, "%.16s ", bu_vls_cstr(&ename)); /* unique name */ + bu_vls_free(&ename); + fprintf(s->ofp, "%d ", s->record.c.c_regionid); /* region ID code */ + fprintf(s->ofp, "%d ", s->record.c.c_aircode); /* air space code */ /* DEPRECATED: # of members */ - fprintf(ofp, "%d ", mcount); + fprintf(s->ofp, "%d ", mcount); /* DEPRECATED: COMGEOM region # */ - fprintf(ofp, "%d ", 0 /* was record.c.c_num */); + fprintf(s->ofp, "%d ", 0 /* was s->record.c.c_num */); - fprintf(ofp, "%d ", record.c.c_material); /* material code */ - fprintf(ofp, "%d ", record.c.c_los); /* equiv. LOS est. */ - fprintf(ofp, "%d %d %d %d ", - record.c.c_override ? 1 : 0, - record.c.c_rgb[0], - record.c.c_rgb[1], - record.c.c_rgb[2]); + fprintf(s->ofp, "%d ", s->record.c.c_material); /* material code */ + fprintf(s->ofp, "%d ", s->record.c.c_los); /* equiv. LOS est. */ + fprintf(s->ofp, "%d %d %d %d ", + s->record.c.c_override ? 1 : 0, + s->record.c.c_rgb[0], + s->record.c.c_rgb[1], + s->record.c.c_rgb[2]); m1 = m2 = 0; - if (isprint((int)record.c.c_matname[0])) { + if (isprint((int)s->record.c.c_matname[0])) { m1 = 1; - if (record.c.c_matparm[0]) + if (s->record.c.c_matparm[0]) m2 = 1; } - fprintf(ofp, "%d %d", m1, m2); - switch (record.c.c_inherit) { + fprintf(s->ofp, "%d %d", m1, m2); + switch (s->record.c.c_inherit) { case DB_INH_HIGHER: - fprintf(ofp, " %d", DB_INH_HIGHER); + fprintf(s->ofp, " %d", DB_INH_HIGHER); break; default: case DB_INH_LOWER: - fprintf(ofp, " %d", DB_INH_LOWER); + fprintf(s->ofp, " %d", DB_INH_LOWER); break; } - fprintf(ofp, "\n"); /* Terminate w/ a newline */ + fprintf(s->ofp, "\n"); /* Terminate w/ a newline */ if (m1) - fprintf(ofp, "%.32s\n", CH(record.c.c_matname)); + fprintf(s->ofp, "%.32s\n", CH(s->record.c.c_matname)); if (m2) - fprintf(ofp, "%.60s\n", CH(record.c.c_matparm)); + fprintf(s->ofp, "%.60s\n", CH(s->record.c.c_matparm)); /* * Output the member records now */ while (BU_LIST_WHILE(mp, mchain, &head)) { - membdump(&mp->r); + membdump(s, &mp->r); BU_LIST_DEQUEUE(&mp->l); BU_PUT(mp, struct mchain); } if (ret_mp) { - memcpy((char *)&record, (char *)&ret_mp->r, sizeof(record)); + memcpy((char *)&s->record, (char *)&ret_mp->r, sizeof(record)); BU_PUT(ret_mp, struct mchain); return 1; } @@ -2207,92 +2229,104 @@ * Intended to be called by combdump only. */ static void -membdump(union record *rp) +membdump(struct ascv4_wstate *s, union record *rp) { int i; - fprintf(ofp, "%c ", rp->M.m_id); /* M */ - fprintf(ofp, "%c ", rp->M.m_relation); /* Boolean oper. */ - fprintf(ofp, "%.16s ", encode_name(rp->M.m_instname)); /* referred-to obj. */ + fprintf(s->ofp, "%c ", rp->M.m_id); /* M */ + fprintf(s->ofp, "%c ", rp->M.m_relation); /* Boolean oper. */ + + struct bu_vls ename = BU_VLS_INIT_ZERO; + encode_name(&ename, rp->M.m_instname); + fprintf(s->ofp, "%.16s ", bu_vls_cstr(&ename));/* referred-to obj. */ + bu_vls_free(&ename); for (i = 0; i < 16; i++) /* homogeneous transform matrix */ - fprintf(ofp, "%.12e ", rp->M.m_mat[i]); - fprintf(ofp, "%d", 0); /* was COMGEOM solid # */ - fprintf(ofp, "\n"); /* Terminate w/ nl */ + fprintf(s->ofp, "%.12e ", rp->M.m_mat[i]); + fprintf(s->ofp, "%d", 0); /* was COMGEOM solid # */ + fprintf(s->ofp, "\n"); /* Terminate w/ nl */ } static void -arsadump(void) /* Print out ARS record information */ +arsadump(struct ascv4_wstate *s) /* Print out ARS record information */ { int i; int length; /* Keep track of number of ARS B records */ - fprintf(ofp, "%c ", record.a.a_id); /* A */ - fprintf(ofp, "%d ", record.a.a_type); /* primitive type */ - fprintf(ofp, "%.16s ", encode_name(record.a.a_name)); /* unique name */ - fprintf(ofp, "%d ", record.a.a_m); /* # of curves */ - fprintf(ofp, "%d ", record.a.a_n); /* # of points per curve */ - fprintf(ofp, "%d ", record.a.a_curlen);/* # of granules per curve */ - fprintf(ofp, "%d ", record.a.a_totlen);/* # of granules for ARS */ - fprintf(ofp, "%.12e ", record.a.a_xmax); /* max x coordinate */ - fprintf(ofp, "%.12e ", record.a.a_xmin); /* min x coordinate */ - fprintf(ofp, "%.12e ", record.a.a_ymax); /* max y coordinate */ - fprintf(ofp, "%.12e ", record.a.a_ymin); /* min y coordinate */ - fprintf(ofp, "%.12e ", record.a.a_zmax); /* max z coordinate */ - fprintf(ofp, "%.12e", record.a.a_zmin); /* min z coordinate */ - fprintf(ofp, "\n"); /* Terminate w/ a newline */ + fprintf(s->ofp, "%c ", s->record.a.a_id); /* A */ + fprintf(s->ofp, "%d ", s->record.a.a_type); /* primitive type */ + struct bu_vls ename = BU_VLS_INIT_ZERO; + encode_name(&ename, s->record.a.a_name); + fprintf(s->ofp, "%.16s ", bu_vls_cstr(&ename)); /* unique name */ + bu_vls_free(&ename); + fprintf(s->ofp, "%d ", s->record.a.a_m); /* # of curves */ + fprintf(s->ofp, "%d ", s->record.a.a_n); /* # of points per curve */ + fprintf(s->ofp, "%d ", s->record.a.a_curlen);/* # of granules per curve */ + fprintf(s->ofp, "%d ", s->record.a.a_totlen);/* # of granules for ARS */ + fprintf(s->ofp, "%.12e ", s->record.a.a_xmax); /* max x coordinate */ + fprintf(s->ofp, "%.12e ", s->record.a.a_xmin); /* min x coordinate */ + fprintf(s->ofp, "%.12e ", s->record.a.a_ymax); /* max y coordinate */ + fprintf(s->ofp, "%.12e ", s->record.a.a_ymin); /* min y coordinate */ + fprintf(s->ofp, "%.12e ", s->record.a.a_zmax); /* max z coordinate */ + fprintf(s->ofp, "%.12e", s->record.a.a_zmin); /* min z coordinate */ + fprintf(s->ofp, "\n"); /* Terminate w/ a newline */ - length = (int)record.a.a_totlen; /* Get # of ARS B records */ + length = (int)s->record.a.a_totlen; /* Get # of ARS B records */ for (i = 0; i < length; i++) { - arsbdump(); + arsbdump(s); } } static void -arsbdump(void) /* Print out ARS B record information */ +arsbdump(struct ascv4_wstate *s) /* Print out ARS B record information */ { int i; size_t ret; /* Read in a member record for processing */ - ret = fread((char *)&record, sizeof record, 1, ifp); + ret = fread((char *)&s->record, sizeof s->record, 1, s->ifp); if (ret != 1) perror("fread"); - fprintf(ofp, "%c ", record.b.b_id); /* B */ - fprintf(ofp, "%d ", record.b.b_type); /* primitive type */ - fprintf(ofp, "%d ", record.b.b_n); /* current curve # */ - fprintf(ofp, "%d", record.b.b_ngranule); /* current granule */ + fprintf(s->ofp, "%c ", s->record.b.b_id); /* B */ + fprintf(s->ofp, "%d ", s->record.b.b_type); /* primitive type */ + fprintf(s->ofp, "%d ", s->record.b.b_n); /* current curve # */ + fprintf(s->ofp, "%d", s->record.b.b_ngranule); /* current granule */ for (i = 0; i < 24; i++) { /* [8*3] vectors */ - fprintf(ofp, " %.12e", record.b.b_values[i]); + fprintf(s->ofp, " %.12e", s->record.b.b_values[i]); } - fprintf(ofp, "\n"); /* Terminate w/ a newline */ + fprintf(s->ofp, "\n"); /* Terminate w/ a newline */ } static void -materdump(void) /* Print out material description record information */ +materdump(struct ascv4_wstate *s) /* Print out material description record information */ { - fprintf(ofp, "%c %d %d %d %d %d %d\n", - record.md.md_id, /* m */ - record.md.md_flags, /* UNUSED */ - record.md.md_low, /* low end of region IDs affected */ - record.md.md_hi, /* high end of region IDs affected */ - record.md.md_r, - record.md.md_g, /* color of regions: 0..255 */ - record.md.md_b); + fprintf(s->ofp, "%c %d %d %d %d %d %d\n", + s->record.md.md_id, /* m */ + s->record.md.md_flags, /* UNUSED */ + s->record.md.md_low, /* low end of region IDs affected */ + s->record.md.md_hi, /* high end of region IDs affected */ + s->record.md.md_r, + s->record.md.md_g, /* color of regions: 0..255 */ + s->record.md.md_b); } static void -bspldump(void) /* Print out B-spline solid description record information */ +bspldump(struct ascv4_wstate *s) /* Print out B-spline solid description record information */ { - fprintf(ofp, "%c %.16s %d\n", - record.B.B_id, /* b */ - encode_name(record.B.B_name), /* unique name */ - record.B.B_nsurf); /* # of surfaces in this solid */ + struct bu_vls ename = BU_VLS_INIT_ZERO; + encode_name(&ename, s->record.B.B_name); + + fprintf(s->ofp, "%c %.16s %d\n", + s->record.B.B_id, /* b */ + bu_vls_cstr(&ename), /* unique name */ + s->record.B.B_nsurf); /* # of surfaces in this solid */ + + bu_vls_free(&ename); } static void -bsurfdump(void) /* Print d-spline surface description record information */ +bsurfdump(struct ascv4_wstate *s) /* Print d-spline surface description record information */ { size_t i; float *vp; @@ -2299,17 +2333,17 @@ size_t nbytes, count; float *fp; - fprintf(ofp, "%c %d %d %d %d %d %d %d %d %d\n", - record.d.d_id, /* D */ - record.d.d_order[0], /* order of u and v directions */ - record.d.d_order[1], /* order of u and v directions */ - record.d.d_kv_size[0], /* knot vector size (u and v) */ - record.d.d_kv_size[1], /* knot vector size (u and v) */ - record.d.d_ctl_size[0], /* control mesh size (u and v) */ - record.d.d_ctl_size[1], /* control mesh size (u and v) */ - record.d.d_geom_type, /* geom type 3 or 4 */ - record.d.d_nknots, /* # granules of knots */ - record.d.d_nctls); /* # granules of ctls */ + fprintf(s->ofp, "%c %d %d %d %d %d %d %d %d %d\n", + s->record.d.d_id, /* D */ + s->record.d.d_order[0], /* order of u and v directions */ + s->record.d.d_order[1], /* order of u and v directions */ + s->record.d.d_kv_size[0], /* knot vector size (u and v) */ + s->record.d.d_kv_size[1], /* knot vector size (u and v) */ + s->record.d.d_ctl_size[0], /* control mesh size (u and v) */ + s->record.d.d_ctl_size[1], /* control mesh size (u and v) */ + s->record.d.d_geom_type, /* geom type 3 or 4 */ + s->record.d.d_nknots, /* # granules of knots */ + s->record.d.d_nctls); /* # granules of ctls */ /* * The b_surf_head record is followed by * d_nknots granules of knot vectors (first u, then v), @@ -2327,36 +2361,36 @@ */ /* Malloc and clear memory for the KNOT DATA and read it */ - nbytes = record.d.d_nknots * sizeof(union record); + nbytes = s->record.d.d_nknots * sizeof(union record); vp = (float *)bu_calloc((unsigned int)nbytes, 1, "KNOT DATA"); fp = vp; - count = fread((char *)fp, 1, nbytes, ifp); + count = fread((char *)fp, 1, nbytes, s->ifp); if (count != nbytes) { fprintf(stderr, "g2asc: spline knot read failure\n"); bu_exit(1, NULL); } /* Print the knot vector information */ - count = record.d.d_kv_size[0] + record.d.d_kv_size[1]; + count = s->record.d.d_kv_size[0] + s->record.d.d_kv_size[1]; for (i = 0; i < count; i++) { - fprintf(ofp, "%.12e\n", *vp++); + fprintf(s->ofp, "%.12e\n", *vp++); } /* Free the knot data memory */ (void)bu_free((char *)fp, "KNOT DATA"); /* Malloc and clear memory for the CONTROL MESH data and read it */ - nbytes = record.d.d_nctls * sizeof(union record); + nbytes = s->record.d.d_nctls * sizeof(union record); vp = (float *)bu_calloc((unsigned int)nbytes, 1, "CONTROL MESH"); fp = vp; - count = fread((char *)fp, 1, nbytes, ifp); + count = fread((char *)fp, 1, nbytes, s->ifp); if (count != nbytes) { fprintf(stderr, "g2asc: control mesh read failure\n"); bu_exit(1, NULL); } /* Print the control mesh information */ - count = record.d.d_ctl_size[0] * record.d.d_ctl_size[1] * - record.d.d_geom_type; + count = s->record.d.d_ctl_size[0] * s->record.d.d_ctl_size[1] * + s->record.d.d_geom_type; for (i = 0; i < count; i++) { - fprintf(ofp, "%.12e\n", *vp++); + fprintf(s->ofp, "%.12e\n", *vp++); } /* Free the control mesh memory */ (void)bu_free((char *)fp, "CONTROL MESH"); @@ -2406,7 +2440,7 @@ } static void -extrdump(void) +extrdump(struct ascv4_wstate *s) { struct rt_extrude_internal *extr; int ngranules; @@ -2414,13 +2448,13 @@ struct bu_external ext; struct rt_db_internal intern; - myname = record.extr.ex_name; - ngranules = ntohl(*(uint32_t *)record.extr.ex_count) + 1; - get_ext(&ext, ngranules); + myname = s->record.extr.ex_name; + ngranules = ntohl(*(uint32_t *)s->record.extr.ex_count) + 1; + get_ext(s, &ext, ngranules); /* Hand off to librt's import() routine */ RT_DB_INTERNAL_INIT(&intern); - if ((OBJ[ID_EXTRUDE].ft_import4(&intern, &ext, id_mat, DBI_NULL, &rt_uniresource)) != 0) { + if ((OBJ[ID_EXTRUDE].ft_import4(&intern, &ext, s->id_mat, DBI_NULL, &rt_uniresource)) != 0) { fprintf(stderr, "g2asc: extrusion import failure\n"); bu_exit(-1, NULL); } @@ -2428,18 +2462,21 @@ extr = (struct rt_extrude_internal *)intern.idb_ptr; RT_EXTRUDE_CK_MAGIC(extr); - fprintf(ofp, "%c ", DBID_EXTR); /* e */ - fprintf(ofp, "%.16s ", encode_name(myname)); /* unique name */ - fprintf(ofp, "%.16s ", encode_name(extr->sketch_name)); - fprintf(ofp, "%d ", extr->keypoint); - fprintf(ofp, "%.12e %.12e %.12e ", V3ARGS(extr->V)); - fprintf(ofp, "%.12e %.12e %.12e ", V3ARGS(extr->h)); - fprintf(ofp, "%.12e %.12e %.12e ", V3ARGS(extr->u_vec)); - fprintf(ofp, "%.12e %.12e %.12e\n", V3ARGS(extr->v_vec)); + fprintf(s->ofp, "%c ", DBID_EXTR); /* e */ + struct bu_vls ename = BU_VLS_INIT_ZERO; + encode_name(&ename, myname); + fprintf(s->ofp, "%.16s ", bu_vls_cstr(&ename)); /* unique name */ + encode_name(&ename, extr->sketch_name); + fprintf(s->ofp, "%.16s ", bu_vls_cstr(&ename)); + fprintf(s->ofp, "%d ", extr->keypoint); + fprintf(s->ofp, "%.12e %.12e %.12e ", V3ARGS(extr->V)); + fprintf(s->ofp, "%.12e %.12e %.12e ", V3ARGS(extr->h)); + fprintf(s->ofp, "%.12e %.12e %.12e ", V3ARGS(extr->u_vec)); + fprintf(s->ofp, "%.12e %.12e %.12e\n", V3ARGS(extr->v_vec)); } static void -sketchdump(void) +sketchdump(struct ascv4_wstate *s) { struct rt_sketch_internal *skt; size_t ngranules; @@ -2449,13 +2486,13 @@ size_t i, j; struct rt_curve *crv; - myname = record.skt.skt_name; - ngranules = ntohl(*(uint32_t *)record.skt.skt_count) + 1; - get_ext(&ext, ngranules); + myname = s->record.skt.skt_name; + ngranules = ntohl(*(uint32_t *)s->record.skt.skt_count) + 1; + get_ext(s, &ext, ngranules); /* Hand off to librt's import() routine */ RT_DB_INTERNAL_INIT(&intern); - if ((OBJ[ID_SKETCH].ft_import4(&intern, &ext, id_mat, DBI_NULL, &rt_uniresource)) != 0) { + if ((OBJ[ID_SKETCH].ft_import4(&intern, &ext, s->id_mat, DBI_NULL, &rt_uniresource)) != 0) { fprintf(stderr, "g2asc: sketch import failure\n"); bu_exit(-1, NULL); } @@ -2463,15 +2500,18 @@ skt = (struct rt_sketch_internal *)intern.idb_ptr; RT_SKETCH_CK_MAGIC(skt); crv = &skt->curve; - fprintf(ofp, "%c ", DBID_SKETCH); /* d */ - fprintf(ofp, "%.16s ", encode_name(myname)); /* unique name */ - fprintf(ofp, "%.12e %.12e %.12e ", V3ARGS(skt->V)); - fprintf(ofp, "%.12e %.12e %.12e ", V3ARGS(skt->u_vec)); - fprintf(ofp, "%.12e %.12e %.12e ", V3ARGS(skt->v_vec)); - fprintf(ofp, "%lu %lu\n", (unsigned long)skt->vert_count, (unsigned long)crv->count); + fprintf(s->ofp, "%c ", DBID_SKETCH); /* d */ + struct bu_vls ename = BU_VLS_INIT_ZERO; + encode_name(&ename, myname); + fprintf(s->ofp, "%.16s ", bu_vls_cstr(&ename)); /* unique name */ + bu_vls_free(&ename); + fprintf(s->ofp, "%.12e %.12e %.12e ", V3ARGS(skt->V)); + fprintf(s->ofp, "%.12e %.12e %.12e ", V3ARGS(skt->u_vec)); + fprintf(s->ofp, "%.12e %.12e %.12e ", V3ARGS(skt->v_vec)); + fprintf(s->ofp, "%lu %lu\n", (unsigned long)skt->vert_count, (unsigned long)crv->count); for (i = 0; i < skt->vert_count; i++) - fprintf(ofp, " %.12e %.12e", V2ARGS(skt->verts[i])); - fprintf(ofp, "\n"); + fprintf(s->ofp, " %.12e %.12e", V2ARGS(skt->verts[i])); + fprintf(s->ofp, "\n"); for (j = 0; j < crv->count; j++) { long *lng; @@ -2484,23 +2524,23 @@ switch (*lng) { case CURVE_LSEG_MAGIC: lsg = (struct line_seg *)lng; - fprintf(ofp, " L %d %d %d\n", crv->reverse[j], lsg->start, lsg->end); + fprintf(s->ofp, " L %d %d %d\n", crv->reverse[j], lsg->start, lsg->end); break; case CURVE_CARC_MAGIC: csg = (struct carc_seg *)lng; - fprintf(ofp, " A %d %d %d %.12e %d %d\n", crv->reverse[j], csg->start, csg->end, + fprintf(s->ofp, " A %d %d %d %.12e %d %d\n", crv->reverse[j], csg->start, csg->end, csg->radius, csg->center_is_left, csg->orientation); break; case CURVE_NURB_MAGIC: nsg = (struct nurb_seg *)lng; - fprintf(ofp, " N %d %d %d %d %d\n ", crv->reverse[j], nsg->order, nsg->pt_type, + fprintf(s->ofp, " N %d %d %d %d %d\n ", crv->reverse[j], nsg->order, nsg->pt_type, nsg->k.k_size, nsg->c_size); for (k = 0; k < nsg->k.k_size; k++) - fprintf(ofp, " %.12e", nsg->k.knots[k]); - fprintf(ofp, "\n "); + fprintf(s->ofp, " %.12e", nsg->k.knots[k]); + fprintf(s->ofp, "\n "); for (k = 0; k < nsg->c_size; k++) - fprintf(ofp, " %d", nsg->ctl_points[k]); - fprintf(ofp, "\n"); + fprintf(s->ofp, " %d", nsg->ctl_points[k]); + fprintf(s->ofp, "\n"); break; } } @@ -2511,7 +2551,7 @@ /*******************************************************************/ int asc_write_v4( - struct gcv_context *UNUSED(c), + struct gcv_context *c, const struct gcv_opts *UNUSED(o), const char *dest_path ) @@ -2518,18 +2558,43 @@ { if (!dest_path) return 0; + // If we don't have a v4 dbip, this won't (currently) work. + // Need to downgrade the db first, or update this logic to + // work with in-mem data rather than the disk file... + + if (db_version(c->dbip) < 5) { + bu_log("Attempting to write v4 asc output with a v5 database - unsupported\n"); + return 0; + } + + struct ascv4_wstate *s = ascv4_wcreate(); + + s->ifp = c->dbip->dbi_fp; + + if (!s->ifp) { + bu_log("Could not open %s for reading.\n", c->dbip->dbi_filename); + ascv4_wdestroy(s); + return 0; + } + s->ofp = fopen(dest_path, "wb"); + if (!s->ofp) { + bu_log("Could not open %s for writing.\n", dest_path); + ascv4_wdestroy(s); + return 0; + } + top: -do { + do { /* A v4 record is already in the input buffer */ /* Check record type and skip deleted records */ - switch (record.u_id) { + switch (s->record.u_id) { case ID_FREE: continue; case ID_SOLID: - soldump(); + soldump(s); continue; case ID_COMB: - if (combdump() > 0) + if (combdump(s) > 0) goto top; continue; case ID_MEMB: @@ -2536,62 +2601,63 @@ fprintf(stderr, "g2asc: stray MEMB record, skipped\n"); continue; case ID_ARS_A: - arsadump(); + arsadump(s); continue; case ID_P_HEAD: - polyhead_asc(); + polyhead_asc(s); continue; case ID_P_DATA: - polydata_asc(); + polydata_asc(s); continue; case ID_IDENT: - idendump(); + idendump(s); continue; case ID_MATERIAL: - materdump(); + materdump(s); continue; case DBID_PIPE: - pipe_dump(); + pipe_dump(s); continue; case DBID_STRSOL: - strsol_dump(); + strsol_dump(s); continue; case DBID_NMG: - nmg_dump(); + nmg_dump(s); continue; case DBID_PARTICLE: - particle_dump(); + particle_dump(s); continue; case DBID_ARBN: - arbn_dump(); + arbn_dump(s); continue; case DBID_CLINE: - cline_dump(); + cline_dump(s); continue; case DBID_BOT: - bot_dump(); + bot_dump(s); continue; case ID_BSOLID: - bspldump(); + bspldump(s); continue; case ID_BSURF: - bsurfdump(); + bsurfdump(s); continue; case DBID_SKETCH: - sketchdump(); + sketchdump(s); continue; case DBID_EXTR: - extrdump(); + extrdump(s); continue; default: fprintf(stderr, - "g2asc: unable to convert record type '%c' (0%o), skipping\n", - record.u_id, record.u_id); + "g2asc: unable to convert record type '%c' (0%o), skipping\n", + s->record.u_id, s->record.u_id); continue; } - } while (fread((char *)&record, sizeof record, 1, ifp) == 1 && - !feof(ifp)); + } while (fread((char *)&s->record, sizeof s->record, 1, s->ifp) == 1 && + !feof(s->ifp)); + ascv4_wdestroy(s); return 1; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ BRL-CAD Source Commits mailing list brlcad-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/brlcad-commits