Esempio n. 1
0
int
rt_retrieve_binunif(struct rt_db_internal *intern,
		    struct db_i	*dbip,
		    char *name)
{
    register struct directory	*dp;
    struct rt_binunif_internal	*bip;
    struct bu_external		ext;
    struct db5_raw_internal		raw;
    char				*tmp;

    /*
     *Find the guy we're told to write
     */
    if ( (dp = db_lookup( dbip, name, LOOKUP_NOISY)) == DIR_NULL )
	return -1;

    RT_INIT_DB_INTERNAL(intern);
    if ( rt_db_get_internal5( intern, dp, dbip, NULL, &rt_uniresource)
	 != ID_BINUNIF     || db_get_external( &ext, dp, dbip ) < 0 )
	return -1;

    if (db5_get_raw_internal_ptr(&raw, ext.ext_buf) == NULL) {
	bu_log("%s:%d\n", __FILE__, __LINE__);
	bu_free_external( &ext );
	return -1;
    }
    if (db5_type_descrip_from_codes(&tmp, raw.major_type, raw.minor_type))
	tmp = 0;

    if (RT_G_DEBUG & DEBUG_VOL)
	bu_log("get_body() sees type (%d, %d)='%s'\n",
	       raw.major_type, raw.minor_type, tmp);

    if (raw.major_type != DB5_MAJORTYPE_BINARY_UNIF)
	return -1;

    bip = intern->idb_ptr;
    RT_CK_BINUNIF(bip);
    if (RT_G_DEBUG & DEBUG_HF)
	rt_binunif_dump(bip);

    if (RT_G_DEBUG & DEBUG_VOL)
	bu_log("cmd_export_body() thinks bip->count=%d\n",
	       bip->count);

    switch (bip -> type) {
	case DB5_MINORTYPE_BINU_FLOAT:
	    if (RT_G_DEBUG & DEBUG_VOL)
		bu_log("bip->type switch... float");
	    break;
	case DB5_MINORTYPE_BINU_DOUBLE:
	    if (RT_G_DEBUG & DEBUG_VOL)
		bu_log("bip->type switch... double");
	    break;
	case DB5_MINORTYPE_BINU_8BITINT:
	    if (RT_G_DEBUG & DEBUG_VOL)
		bu_log("bip->type switch... 8bitint");
	    break;
	case DB5_MINORTYPE_BINU_8BITINT_U:
	    if (RT_G_DEBUG & DEBUG_VOL)
		bu_log("bip->type switch... 8bituint");
	    break;
	case DB5_MINORTYPE_BINU_16BITINT:
	    if (RT_G_DEBUG & DEBUG_VOL)
		bu_log("bip->type switch... 16bituint");
	    break;
	case DB5_MINORTYPE_BINU_16BITINT_U:
	    if (RT_G_DEBUG & DEBUG_VOL)
		bu_log("bip->type switch... 16bitint");
	    break;
	case DB5_MINORTYPE_BINU_32BITINT:
	case DB5_MINORTYPE_BINU_32BITINT_U:
	    if (RT_G_DEBUG & DEBUG_VOL)
		bu_log("bip->type switch... 32bitint");
	    break;
	case DB5_MINORTYPE_BINU_64BITINT:
	case DB5_MINORTYPE_BINU_64BITINT_U:
	    if (RT_G_DEBUG & DEBUG_VOL)
		bu_log("bip->type switch... 64bitint");
	    break;
	default:
	    /* XXX	This shouln't happen!!    */
	    bu_log("bip->type switch... default");
	    break;
    }

    bu_free_external( &ext );

    return 0;
}
Esempio n. 2
0
int
ged_unhide(struct ged *gedp, int argc, const char *argv[])
{
    struct directory *dp;
    struct db_i *dbip;
    struct bu_external ext;
    struct bu_external tmp;
    struct db5_raw_internal raw;
    int i;
    static const char *usage = "object(s)";

    GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR);
    GED_CHECK_READ_ONLY(gedp, GED_ERROR);
    GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR);

    /* initialize result */
    bu_vls_trunc(gedp->ged_result_str, 0);

    /* must be wanting help */
    if (argc == 1) {
	bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
	return GED_HELP;
    }

    dbip = gedp->ged_wdbp->dbip;

    if (db_version(dbip) < 5) {
	bu_vls_printf(gedp->ged_result_str, "Database was created with a previous release of BRL-CAD.\nSelect \"Tools->Upgrade Database...\" to enable support for this feature.");
	return GED_ERROR;
    }

    for (i = 1; i < argc; i++) {
	if ((dp = db_lookup(dbip, argv[i], LOOKUP_NOISY)) == RT_DIR_NULL) {
	    continue;
	}

	RT_CK_DIR(dp);

	BU_EXTERNAL_INIT(&ext);

	if (db_get_external(&ext, dp, dbip) < 0) {
	    bu_vls_printf(gedp->ged_result_str, "db_get_external failed for %s\n", dp->d_namep);
	    continue;
	}

	if (db5_get_raw_internal_ptr(&raw, ext.ext_buf) == NULL) {
	    bu_vls_printf(gedp->ged_result_str, "db5_get_raw_internal_ptr() failed for %s\n", dp->d_namep);
	    bu_free_external(&ext);
	    continue;
	}

	raw.h_name_hidden = (unsigned char)(0x0);

	BU_EXTERNAL_INIT(&tmp);
	db5_export_object3(&tmp, DB5HDR_HFLAGS_DLI_APPLICATION_DATA_OBJECT,
			   dp->d_namep,
			   raw.h_name_hidden,
			   &raw.attributes,
			   &raw.body,
			   raw.major_type, raw.minor_type,
			   raw.a_zzz, raw.b_zzz);
	bu_free_external(&ext);

	if (db_put_external(&tmp, dp, dbip)) {
	    bu_vls_printf(gedp->ged_result_str, "db_put_external() failed for %s\n", dp->d_namep);
	    bu_free_external(&tmp);
	    continue;
	}
	bu_free_external(&tmp);
	dp->d_flags &= (~RT_DIR_HIDDEN);
    }

    return GED_OK;
}
Esempio n. 3
0
/*
 *		C M D _ E X P O R T _ B O D Y ( )
 *
 *	Write an object's body to disk file
 *
 */
int
cmd_export_body(ClientData clientData, Tcl_Interp *interp, int argc, char **argv)
{
    register struct directory	*dp;
    int				fd;
    void			*bufp;
    size_t			nbytes = 0;
    long int			written;
    struct bu_external		ext;
    struct db5_raw_internal	raw;
    struct rt_db_internal	intern;
    struct rt_binunif_internal	*bip;
    struct bu_vls		vls;
#if 0
    int				status;
#endif
    char			*tmp;

    CHECK_DBI_NULL;

    if (argc != 3) {
	bu_vls_init(&vls);
	bu_vls_printf(&vls, "help %s", argv[0]);
	Tcl_Eval(interp, bu_vls_addr(&vls));
	bu_vls_free(&vls);
	return TCL_ERROR;
    }

    /*
     *	Find the guy we're told to write
     */
    if ( (dp = db_lookup( dbip, argv[2], LOOKUP_NOISY)) == DIR_NULL ) {
	bu_vls_init( &vls );
	bu_vls_printf( &vls,
		       "Cannot find object %s for writing\n", argv[2] );
	Tcl_SetResult(interp, bu_vls_addr( &vls ), TCL_VOLATILE );
	bu_vls_free( &vls );
	mged_print_result( TCL_ERROR );
	return TCL_ERROR;
    }
    RT_INIT_DB_INTERNAL(&intern);
    if ( rt_db_get_internal5( &intern, dp, dbip, NULL, &rt_uniresource)
	 != ID_BINUNIF
	 || db_get_external( &ext, dp, dbip ) < 0 ) {
	(void)signal( SIGINT, SIG_IGN );
	TCL_READ_ERR_return;
    }
    if (db5_get_raw_internal_ptr(&raw, ext.ext_buf) == NULL)
    {
	bu_free_external( &ext );
	(void)signal( SIGINT, SIG_IGN );
	TCL_READ_ERR_return;
    }

    /*
     *	Do the writing
     */
#ifndef _WIN32
    if ( (fd = creat( argv[1], S_IRWXU | S_IRGRP | S_IROTH  )) == -1 ) {
#else
	if ( (fd = creat( argv[1], _S_IREAD | _S_IWRITE  )) == -1 ) {
#endif
	    bu_free_external( &ext );
	    bu_vls_init( &vls );
	    bu_vls_printf( &vls,
			   "Cannot open file %s for writing\n", argv[1] );
	    Tcl_SetResult(interp, bu_vls_addr( &vls ), TCL_VOLATILE );
	    bu_vls_free( &vls );
	    mged_print_result( TCL_ERROR );
	    return TCL_ERROR;
	}
	if (db5_type_descrip_from_codes(&tmp, raw.major_type, raw.minor_type))
	    tmp = 0;

	if (RT_G_DEBUG & DEBUG_VOL)
	    bu_log("cmd_export_body() sees type (%d, %d)='%s'\n",
		   raw.major_type, raw.minor_type, tmp);
	switch (raw.major_type) {
	    case DB5_MAJORTYPE_BINARY_UNIF:
#if 0
		if ( rt_binunif_import5( &intern, &ext, 0, dbip,
					 &rt_uniresource, raw.minor_type  ) ) {
		    (void)signal( SIGINT, SIG_IGN );
		    TCL_READ_ERR_return;
		}
#endif
		bip = (struct rt_binunif_internal *) intern.idb_ptr;
		RT_CK_BINUNIF(bip);
		rt_binunif_dump(bip);
		bufp = (void *) bip->u.uint8;
		bu_log("cmd_export_body() thinks bip->count=%d\n", bip->count);
		switch (bip -> type) {
		    case DB5_MINORTYPE_BINU_FLOAT:
			if (RT_G_DEBUG & DEBUG_VOL)
			    bu_log("bip->type switch... float");
			nbytes = (size_t) (bip->count * sizeof(float));
			break;
		    case DB5_MINORTYPE_BINU_DOUBLE:
			if (RT_G_DEBUG & DEBUG_VOL)
			    bu_log("bip->type switch... double");
			nbytes = (size_t) (bip->count * sizeof(double));
			break;
		    case DB5_MINORTYPE_BINU_8BITINT:
		    case DB5_MINORTYPE_BINU_8BITINT_U:
			if (RT_G_DEBUG & DEBUG_VOL)
			    bu_log("bip->type switch... 8bitint");
			nbytes = (size_t) (bip->count);
			break;
		    case DB5_MINORTYPE_BINU_16BITINT:
			if (RT_G_DEBUG & DEBUG_VOL)
			    bu_log("bip->type switch... 16bitint");
			nbytes = (size_t) (bip->count * 2);
			bu_log("data[0] = %u\n", bip->u.uint16[0]);
			break;
		    case DB5_MINORTYPE_BINU_16BITINT_U:
			if (RT_G_DEBUG & DEBUG_VOL)
			    bu_log("bip->type switch... 16bituint");
			nbytes = (size_t) (bip->count * 2);
			bu_log("data[0] = %u\n", bip->u.uint16[0]);
			break;
		    case DB5_MINORTYPE_BINU_32BITINT:
		    case DB5_MINORTYPE_BINU_32BITINT_U:
			if (RT_G_DEBUG & DEBUG_VOL)
			    bu_log("bip->type switch... 32bitint");
			nbytes = (size_t) (bip->count * 4);
			break;
		    case DB5_MINORTYPE_BINU_64BITINT:
		    case DB5_MINORTYPE_BINU_64BITINT_U:
			if (RT_G_DEBUG & DEBUG_VOL)
			    bu_log("bip->type switch... 64bitint");
			nbytes = (size_t) (bip->count * 8);
			break;
		    default:
			/* XXX	This shouln't happen!!    */
			bu_log("bip->type switch... default");
			break;
		}
		break;
	    default:
		if (RT_G_DEBUG & DEBUG_VOL)
		    bu_log("I'm in the default\n");
		bufp = (void *) ext.ext_buf;
		nbytes = (size_t) ext.ext_nbytes;
		break;
	}
	if (RT_G_DEBUG & DEBUG_VOL)
	    bu_log("going to write %ld bytes\n", nbytes);

	if ( (written = write(fd, bufp, nbytes) ) != nbytes ) {
	    perror(argv[1]);
	    bu_log("%s:%d\n", __FILE__, __LINE__);
	    bu_free_external( &ext );
	    bu_vls_init( &vls );
	    bu_vls_printf( &vls,
			   "Incomplete write of object %s to file %s, got %ld, s/b=%ld\n",
			   argv[2], argv[1], written, nbytes );
	    Tcl_SetResult(interp, bu_vls_addr( &vls ), TCL_VOLATILE );
	    bu_vls_free( &vls );
	    mged_print_result( TCL_ERROR );
	    return TCL_ERROR;
	}

	bu_free_external( &ext );
	return TCL_OK;
    }