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

Reply via email to