Revision: 57239
http://sourceforge.net/p/brlcad/code/57239
Author: tbrowder2
Date: 2013-08-28 21:14:26 +0000 (Wed, 28 Aug 2013)
Log Message:
-----------
add some convenience enums and a func to ease maintaining guts of attr func;
collect name and value lengths earlier in func
Modified Paths:
--------------
brlcad/trunk/src/libged/attr.c
Modified: brlcad/trunk/src/libged/attr.c
===================================================================
--- brlcad/trunk/src/libged/attr.c 2013-08-28 20:58:42 UTC (rev 57238)
+++ brlcad/trunk/src/libged/attr.c 2013-08-28 21:14:26 UTC (rev 57239)
@@ -93,6 +93,44 @@
return GED_OK;
}
+typedef enum {
+ ATTR_APPEND,
+ ATTR_GET,
+ ATTR_RM,
+ ATTR_SET,
+ ATTR_SHOW,
+ ATTR_SORT,
+ ATTR_UNKNOWN
+} _attr_subcmd_t;
+
+_attr_subcmd_t
+_get_subcmd(const char* arg)
+{
+ /* sub-commands */
+ const char APPEND[] = "append";
+ const char GET[] = "get";
+ const char RM[] = "rm";
+ const char SET[] = "set";
+ const char SHOW[] = "show";
+ const char SORT[] = "sort";
+
+ /* in one user's predicted order of frequency: */
+ if (BU_STR_EQUAL(SHOW, arg))
+ return ATTR_SHOW;
+ else if (BU_STR_EQUAL(SET, arg))
+ return ATTR_SET;
+ else if (BU_STR_EQUAL(SORT, arg))
+ return ATTR_SORT;
+ else if (BU_STR_EQUAL(RM, arg))
+ return ATTR_RM;
+ else if (BU_STR_EQUAL(APPEND, arg))
+ return ATTR_APPEND;
+ else if (BU_STR_EQUAL(GET, arg))
+ return ATTR_GET;
+ else
+ return ATTR_UNKNOWN;
+}
+
int
ged_attr(struct ged *gedp, int argc, const char *argv[])
{
@@ -101,15 +139,8 @@
struct bu_attribute_value_set avs;
struct bu_attribute_value_pair *avpp;
static const char *usage = "{set|get|show|rm|append|sort} object [key
[value] ... ]";
+ _attr_subcmd_t scmd;
- /* sub-commands in usage order: */
- const char SET[] = "set";
- const char GET[] = "get";
- const char SHOW[] = "show";
- const char RM[] = "rm";
- const char APPEND[] = "append";
- const char SORT[] = "sort";
-
/* sort types */
const char CASE[] = "case";
const char NOCASE[] = "nocase";
@@ -155,21 +186,29 @@
return GED_ERROR;
}
+ scmd = _get_subcmd(argv[1]);
+ if ((scmd == ATTR_SHOW && argc == 3) || scmd == ATTR_SORT) {
+ /* get a jump on calculating name and value lengths */
+ for (i = 0, avpp = avs.avp; i < avs.count; i++, avpp++) {
+ int len = (int)strlen(avpp->name);
+ if (len > max_attr_name_len)
+ max_attr_name_len = len;
+ if (avpp->value) {
+ len = (int)strlen(avpp->value);
+ if (len > max_attr_value_len)
+ max_attr_value_len = len;
+ }
+ }
+ }
+
/* default: sort attribute-value set array by attribute name (case
sensitive) */
qsort(&avs.avp[0], avs.count, sizeof(struct bu_attribute_value_pair),
_ged_cmpattr);
- if (BU_STR_EQUAL(argv[1], SORT)) {
+ if (scmd == ATTR_SORT) {
/* pretty print */
if ((_ged_pretty_print(gedp, dp, argv[2])) != GED_OK)
return GED_ERROR;
- for (i = 0, avpp = avs.avp; i < avs.count; i++, avpp++) {
- int len = (int)strlen(avpp->name);
- if (len > max_attr_name_len) {
- max_attr_name_len = len;
- }
- }
-
if (argc == 3) {
/* just list the already sorted attribute-value pairs */
for (i = 0, avpp = avs.avp; i < avs.count; i++, avpp++) {
@@ -195,7 +234,7 @@
avpp->name, avpp->value);
}
}
- } else if (BU_STR_EQUAL(argv[1], GET)) {
+ } else if (scmd == ATTR_GET) {
if (argc == 3) {
/* just list all the attributes */
for (i = 0, avpp = avs.avp; i < avs.count; i++, avpp++) {
@@ -225,7 +264,7 @@
bu_avs_free(&avs);
- } else if (BU_STR_EQUAL(argv[1], SET)) {
+ } else if (scmd == ATTR_SET) {
GED_CHECK_READ_ONLY(gedp, GED_ERROR);
/* setting attribute/value pairs */
if ((argc - 3) % 2) {
@@ -253,7 +292,7 @@
/* avs is freed by db5_update_attributes() */
- } else if (BU_STR_EQUAL(argv[1], RM)) {
+ } else if (scmd == ATTR_RM) {
GED_CHECK_READ_ONLY(gedp, GED_ERROR);
i = 3;
while (i < (size_t)argc) {
@@ -272,7 +311,7 @@
/* avs is freed by db5_replace_attributes() */
- } else if (BU_STR_EQUAL(argv[1], APPEND)) {
+ } else if (scmd == ATTR_APPEND) {
GED_CHECK_READ_ONLY(gedp, GED_ERROR);
if ((argc-3) % 2) {
bu_vls_printf(gedp->ged_result_str,
@@ -309,7 +348,7 @@
/* avs is freed by db5_replace_attributes() */
- } else if (BU_STR_EQUAL(argv[1], SHOW)) {
+ } else if (scmd == ATTR_SHOW) {
int tabs1 = 0;
/* pretty print */
@@ -319,12 +358,6 @@
if (argc == 3) {
/* just display all attributes */
for (i = 0, avpp = avs.avp; i < avs.count; i++, avpp++) {
- int len = (int)strlen(avpp->name);
- if (len > max_attr_name_len) {
- max_attr_name_len = len;
- }
- }
- for (i = 0, avpp = avs.avp; i < avs.count; i++, avpp++) {
bu_vls_printf(gedp->ged_result_str, "\t%-*.*s %s\n",
max_attr_name_len, max_attr_name_len,
avpp->name, avpp->value);
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58040911&iu=/4140/ostg.clktrk
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits