Refine user message
authorshingil.kang <shingil.kang@samsung.com>
Fri, 16 Dec 2016 08:47:00 +0000 (17:47 +0900)
committershingil.kang <shingil.kang@samsung.com>
Mon, 19 Dec 2016 04:26:15 +0000 (13:26 +0900)
Change-Id: I133d2f70a9e8a78d524ed6866a1a9643eb40ccdc
Signed-off-by: shingil.kang <shingil.kang@samsung.com>
src/commandline.c
src/sdb_constants.c
src/sdb_constants.h
src/strutils.c
src/strutils.h

index 2041bd952eb7b01db28a0dc9fd5adfda4f14630a..08e07b6bc27e377ef4bca1354c14f4836ab88c42 100755 (executable)
@@ -682,29 +682,19 @@ static void create_opt_list(LIST_NODE** opt_list) {
             COMMANDLINE_SERIAL_DESC_SIZE, COMMANDLINE_SERIAL_ARG_DESC, COMMANDLINE_SERIAL_HAS_ARG);
     prepend(opt_list, serial);
 
-    OPTION* device = NULL;
-    create_option(&device, COMMANDLINE_DEVICE_LONG_OPT, COMMANDLINE_DEVICE_SHORT_OPT, COMMANDLINE_DEVICE_DESC,
-            COMMANDLINE_DEVICES_DESC_SIZE, EMPTY_STRING, COMMANDLINE_DEVICE_HAS_ARG);
-    prepend(opt_list, device);
-
     OPTION* emulator = NULL;
     create_option(&emulator, COMMANDLINE_EMULATOR_LONG_OPT, COMMANDLINE_EMULATOR_SHORT_OPT, COMMANDLINE_EMULATOR_DESC,
             COMMANDLINE_EMULATOR_DESC_SIZE, EMPTY_STRING, COMMANDLINE_EMULATOR_HAS_ARG);
     prepend(opt_list, emulator);
+
+    OPTION* device = NULL;
+    create_option(&device, COMMANDLINE_DEVICE_LONG_OPT, COMMANDLINE_DEVICE_SHORT_OPT, COMMANDLINE_DEVICE_DESC,
+            COMMANDLINE_DEVICES_DESC_SIZE, EMPTY_STRING, COMMANDLINE_DEVICE_HAS_ARG);
+    prepend(opt_list, device);
 }
 
 static void create_cmd_list(LIST_NODE** cmd_list) {
 
-    COMMAND* devices_cmd = NULL;
-    create_command(&devices_cmd, COMMANDLINE_DEVICES_NAME, COMMANDLINE_DEVICES_DESC,
-            COMMANDLINE_DEVICES_DESC_SIZE, EMPTY_STRING, devices, COMMANDLINE_DEVICES_MAX_ARG, COMMANDLINE_DEVICES_MIN_ARG);
-    prepend(cmd_list, devices_cmd);
-
-    COMMAND* connect_cmd = NULL;
-    create_command(&connect_cmd, COMMANDLINE_CONNECT_NAME, COMMANDLINE_CONNECT_DESC,
-            COMMANDLINE_CONNECT_DESC_SIZE, COMMANDLINE_CONNECT_ARG_DESC, __connect, COMMANDLINE_CONNECT_MAX_ARG, COMMANDLINE_CONNECT_MIN_ARG);
-    prepend(cmd_list, connect_cmd);
-
     //TODO REMOTE_DEVICE_CONNECT security issue should be resolved first
 #if 0
     COMMAND* device_con_cmd = NULL;
@@ -726,147 +716,199 @@ static void create_cmd_list(LIST_NODE** cmd_list) {
     prepend(cmd_list, transport_close_cmd);
 #endif
 
+    COMMAND* help_cmd = NULL;
+    create_command(&help_cmd, COMMANDLINE_HELP_NAME, COMMANDLINE_HELP_DESC,
+            COMMANDLINE_HELP_DESC_SIZE, EMPTY_STRING, NULL, 0, 0);
+    prepend(cmd_list, help_cmd);
 
+    COMMAND* version_cmd = NULL;
+    create_command(&version_cmd, COMMANDLINE_VERSION_NAME,
+            COMMANDLINE_VERSION_DESC, COMMANDLINE_VERSION_DESC_SIZE,
+            EMPTY_STRING, version, COMMANDLINE_VERSION_MAX_ARG,
+            COMMANDLINE_VERSION_MIN_ARG);
+    prepend(cmd_list, version_cmd);
 
-    COMMAND* disconnect_cmd = NULL;
-    create_command(&disconnect_cmd, COMMANDLINE_DISCONNECT_NAME, COMMANDLINE_DISCONNECT_DESC,
-            COMMANDLINE_DISCONNECT_DESC_SIZE, COMMANDLINE_DISCONNECT_ARG_DESC, __disconnect, COMMANDLINE_DISCONNECT_MAX_ARG, COMMANDLINE_DISCONNECT_MIN_ARG);
-    prepend(cmd_list, disconnect_cmd);
+    COMMAND* root_cmd = NULL;
+    create_command(&root_cmd, COMMANDLINE_ROOT_NAME, COMMANDLINE_ROOT_DESC,
+            COMMANDLINE_ROOT_DESC_SIZE, COMMANDLINE_ROOT_ARG_DESC, root,
+            COMMANDLINE_ROOT_MAX_ARG, COMMANDLINE_ROOT_MIN_ARG);
+    prepend(cmd_list, root_cmd);
 
-    COMMAND* push_cmd = NULL;
-    create_command(&push_cmd, COMMANDLINE_PUSH_NAME, COMMANDLINE_PUSH_DESC,
-            COMMANDLINE_PUSH_DESC_SIZE, COMMANDLINE_PUSH_ARG_DESC, push, COMMANDLINE_PUSH_MAX_ARG, COMMANDLINE_PUSH_MIN_ARG);
-    prepend(cmd_list, push_cmd);
+    COMMAND* swindow_cmd = NULL;
+    create_command(&swindow_cmd, COMMANDLINE_SWINDOW_NAME,
+            COMMANDLINE_SWINDOW_DESC, COMMANDLINE_SWINDOW_DESC_SIZE,
+            EMPTY_STRING, status_window, COMMANDLINE_SWINDOW_MAX_ARG,
+            COMMANDLINE_SWINDOW_MIN_ARG);
+    prepend(cmd_list, swindow_cmd);
 
-    COMMAND* pull_cmd = NULL;
-    create_command(&pull_cmd, COMMANDLINE_PULL_NAME, COMMANDLINE_PULL_DESC,
-            COMMANDLINE_PULL_DESC_SIZE, COMMANDLINE_PULL_ARG_DESC, pull, COMMANDLINE_PULL_MAX_ARG, COMMANDLINE_PULL_MIN_ARG);
-    prepend(cmd_list, pull_cmd);
+    COMMAND* gserial_cmd = NULL;
+    create_command(&gserial_cmd, COMMANDLINE_GSERIAL_NAME,
+            COMMANDLINE_GSERIAL_DESC, COMMANDLINE_GSERIAL_DESC_SIZE,
+            EMPTY_STRING, get_state_serialno, COMMANDLINE_GSERIAL_MAX_ARG,
+            COMMANDLINE_GSERIAL_MIN_ARG);
+    prepend(cmd_list, gserial_cmd);
 
-    COMMAND* shell_cmd = NULL;
-    create_command(&shell_cmd, COMMANDLINE_SHELL_NAME, COMMANDLINE_SHELL_DESC,
-            COMMANDLINE_SHELL_DESC_SIZE, COMMANDLINE_SHELL_ARG_DESC, shell, COMMANDLINE_SHELL_MAX_ARG, COMMANDLINE_SHELL_MIN_ARG);
-    prepend(cmd_list, shell_cmd);
+    COMMAND* gstate_cmd = NULL;
+    create_command(&gstate_cmd, COMMANDLINE_GSTATE_NAME,
+            COMMANDLINE_GSTATE_DESC, COMMANDLINE_GSTATE_DESC_SIZE, EMPTY_STRING,
+            get_state_serialno, COMMANDLINE_GSTATE_MAX_ARG,
+            COMMANDLINE_GSTATE_MIN_ARG);
+    prepend(cmd_list, gstate_cmd);
+
+    COMMAND* kserver_cmd = NULL;
+    create_command(&kserver_cmd, COMMANDLINE_KSERVER_NAME,
+            COMMANDLINE_KSERVER_DESC, COMMANDLINE_KSERVER_DESC_SIZE,
+            EMPTY_STRING, kill_server, COMMANDLINE_KSERVER_MAX_ARG,
+            COMMANDLINE_KSERVER_MIN_ARG);
+    prepend(cmd_list, kserver_cmd);
+
+    COMMAND* sserver_cmd = NULL;
+    create_command(&sserver_cmd, COMMANDLINE_SSERVER_NAME,
+            COMMANDLINE_SSERVER_DESC, COMMANDLINE_SSERVER_DESC_SIZE,
+            COMMANDLINE_SSERVER_ARG_DESC, start_server,
+            COMMANDLINE_SSERVER_MAX_ARG, COMMANDLINE_SSERVER_MIN_ARG);
+    prepend(cmd_list, sserver_cmd);
+
+#ifdef SUPPORT_ENCRYPT
+    // encryption command
+    COMMAND* encryption_cmd = NULL;
+    create_command(&encryption_cmd, COMMANDLINE_ENCRYPTION_NAME, COMMANDLINE_ENCRYPTION_DESC, COMMANDLINE_ENCRYPTION_DESC_SIZE, COMMANDLINE_ENCRYPTION_ARG_DESC,
+            encryption, COMMANDLINE_ENCRYPTION_MAX_ARG, COMMANDLINE_ENCRYPTION_MIN_ARG);
+    prepend(cmd_list, encryption_cmd);
+#endif
 
     COMMAND* dlog_cmd = NULL;
     create_command(&dlog_cmd, COMMANDLINE_DLOG_NAME, COMMANDLINE_DLOG_DESC,
-            COMMANDLINE_DLOG_DESC_SIZE, COMMANDLINE_DLOG_ARG_DESC, dlog, COMMANDLINE_DLOG_MAX_ARG, COMMANDLINE_DLOG_MIN_ARG);
+            COMMANDLINE_DLOG_DESC_SIZE, COMMANDLINE_DLOG_ARG_DESC, dlog,
+            COMMANDLINE_DLOG_MAX_ARG, COMMANDLINE_DLOG_MIN_ARG);
     prepend(cmd_list, dlog_cmd);
 
-    COMMAND* install_cmd = NULL;
-    create_command(&install_cmd, COMMANDLINE_INSTALL_NAME, COMMANDLINE_INSTALL_DESC,
-            COMMANDLINE_INSTALL_DESC_SIZE, COMMANDLINE_INSTALL_ARG_DESC, install, COMMANDLINE_INSTALL_MAX_ARG, COMMANDLINE_INSTALL_MIN_ARG);
-    prepend(cmd_list, install_cmd);
-
-    COMMAND* uninstall_cmd = NULL;
-    create_command(&uninstall_cmd, COMMANDLINE_UNINSTALL_NAME, COMMANDLINE_UNINSTALL_DESC,
-            COMMANDLINE_UNINSTALL_DESC_SIZE, COMMANDLINE_UNINSTALL_ARG_DESC, uninstall, COMMANDLINE_UNINSTALL_MAX_ARG, COMMANDLINE_UNINSTALL_MIN_ARG);
-    prepend(cmd_list, uninstall_cmd);
-
     COMMAND* forward_remove_all_cmd = NULL;
-    create_command(&forward_remove_all_cmd, COMMANDLINE_FORWARD_REMOVE_ALL_NAME, COMMANDLINE_FORWARD_REMOVE_ALL_DESC,
-            COMMANDLINE_FORWARD_REMOVE_ALL_DESC_SIZE, EMPTY_STRING, forward, COMMANDLINE_FORWARD_REMOVE_ALL_MAX_ARG, COMMANDLINE_FORWARD_REMOVE_ALL_MIN_ARG);
+    create_command(&forward_remove_all_cmd, COMMANDLINE_FORWARD_REMOVE_ALL_NAME,
+            COMMANDLINE_FORWARD_REMOVE_ALL_DESC,
+            COMMANDLINE_FORWARD_REMOVE_ALL_DESC_SIZE, EMPTY_STRING, forward,
+            COMMANDLINE_FORWARD_REMOVE_ALL_MAX_ARG,
+            COMMANDLINE_FORWARD_REMOVE_ALL_MIN_ARG);
     prepend(cmd_list, forward_remove_all_cmd);
 
     COMMAND* forward_remove_cmd = NULL;
-    create_command(&forward_remove_cmd, COMMANDLINE_FORWARD_REMOVE_NAME, COMMANDLINE_FORWARD_REMOVE_DESC,
-            COMMANDLINE_FORWARD_REMOVE_DESC_SIZE, COMMANDLINE_FORWARD_REMOVE_ARG_DESC, forward, COMMANDLINE_FORWARD_REMOVE_MAX_ARG, COMMANDLINE_FORWARD_REMOVE_MIN_ARG);
+    create_command(&forward_remove_cmd, COMMANDLINE_FORWARD_REMOVE_NAME,
+            COMMANDLINE_FORWARD_REMOVE_DESC,
+            COMMANDLINE_FORWARD_REMOVE_DESC_SIZE,
+            COMMANDLINE_FORWARD_REMOVE_ARG_DESC, forward,
+            COMMANDLINE_FORWARD_REMOVE_MAX_ARG,
+            COMMANDLINE_FORWARD_REMOVE_MIN_ARG);
     prepend(cmd_list, forward_remove_cmd);
 
     COMMAND* forward_list_cmd = NULL;
-    create_command(&forward_list_cmd, COMMANDLINE_FORWARD_LIST_NAME, COMMANDLINE_FORWARD_LIST_DESC,
-            COMMANDLINE_FORWARD_LIST_DESC_SIZE, EMPTY_STRING, forward, COMMANDLINE_FORWARD_LIST_MAX_ARG, COMMANDLINE_FORWARD_LIST_MIN_ARG);
+    create_command(&forward_list_cmd, COMMANDLINE_FORWARD_LIST_NAME,
+            COMMANDLINE_FORWARD_LIST_DESC, COMMANDLINE_FORWARD_LIST_DESC_SIZE,
+            EMPTY_STRING, forward, COMMANDLINE_FORWARD_LIST_MAX_ARG,
+            COMMANDLINE_FORWARD_LIST_MIN_ARG);
     prepend(cmd_list, forward_list_cmd);
 
     COMMAND* forward_cmd = NULL;
-    create_command(&forward_cmd, COMMANDLINE_FORWARD_NAME, COMMANDLINE_FORWARD_DESC,
-            COMMANDLINE_FORWARD_DESC_SIZE, COMMANDLINE_FORWARD_ARG_DESC, forward, COMMANDLINE_FORWARD_MAX_ARG, COMMANDLINE_FORWARD_MIN_ARG);
+    create_command(&forward_cmd, COMMANDLINE_FORWARD_NAME,
+            COMMANDLINE_FORWARD_DESC, COMMANDLINE_FORWARD_DESC_SIZE,
+            COMMANDLINE_FORWARD_ARG_DESC, forward, COMMANDLINE_FORWARD_MAX_ARG,
+            COMMANDLINE_FORWARD_MIN_ARG);
     prepend(cmd_list, forward_cmd);
 
-    COMMAND* help_cmd = NULL;
-    create_command(&help_cmd, COMMANDLINE_HELP_NAME, COMMANDLINE_HELP_DESC,
-            COMMANDLINE_HELP_DESC_SIZE, EMPTY_STRING, NULL, 0, 0);
-    prepend(cmd_list, help_cmd);
+    COMMAND* uninstall_cmd = NULL;
+    create_command(&uninstall_cmd, COMMANDLINE_UNINSTALL_NAME,
+            COMMANDLINE_UNINSTALL_DESC, COMMANDLINE_UNINSTALL_DESC_SIZE,
+            COMMANDLINE_UNINSTALL_ARG_DESC, uninstall,
+            COMMANDLINE_UNINSTALL_MAX_ARG, COMMANDLINE_UNINSTALL_MIN_ARG);
+    prepend(cmd_list, uninstall_cmd);
 
-    COMMAND* version_cmd = NULL;
-    create_command(&version_cmd, COMMANDLINE_VERSION_NAME, COMMANDLINE_VERSION_DESC,
-            COMMANDLINE_VERSION_DESC_SIZE, EMPTY_STRING, version, COMMANDLINE_VERSION_MAX_ARG, COMMANDLINE_VERSION_MIN_ARG);
-    prepend(cmd_list, version_cmd);
+    COMMAND* install_cmd = NULL;
+    create_command(&install_cmd, COMMANDLINE_INSTALL_NAME,
+            COMMANDLINE_INSTALL_DESC, COMMANDLINE_INSTALL_DESC_SIZE,
+            COMMANDLINE_INSTALL_ARG_DESC, install, COMMANDLINE_INSTALL_MAX_ARG,
+            COMMANDLINE_INSTALL_MIN_ARG);
+    prepend(cmd_list, install_cmd);
 
-    COMMAND* sserver_cmd = NULL;
-    create_command(&sserver_cmd, COMMANDLINE_SSERVER_NAME, COMMANDLINE_SSERVER_DESC,
-            COMMANDLINE_SSERVER_DESC_SIZE, COMMANDLINE_SSERVER_ARG_DESC, start_server, COMMANDLINE_SSERVER_MAX_ARG, COMMANDLINE_SSERVER_MIN_ARG);
-    prepend(cmd_list, sserver_cmd);
+    COMMAND* shell_cmd = NULL;
+    create_command(&shell_cmd, COMMANDLINE_SHELL_NAME, COMMANDLINE_SHELL_DESC,
+            COMMANDLINE_SHELL_DESC_SIZE, COMMANDLINE_SHELL_ARG_DESC, shell,
+            COMMANDLINE_SHELL_MAX_ARG, COMMANDLINE_SHELL_MIN_ARG);
+    prepend(cmd_list, shell_cmd);
 
-    COMMAND* kserver_cmd = NULL;
-    create_command(&kserver_cmd, COMMANDLINE_KSERVER_NAME, COMMANDLINE_KSERVER_DESC,
-            COMMANDLINE_KSERVER_DESC_SIZE, EMPTY_STRING, kill_server, COMMANDLINE_KSERVER_MAX_ARG, COMMANDLINE_KSERVER_MIN_ARG);
-    prepend(cmd_list, kserver_cmd);
+    COMMAND* pull_cmd = NULL;
+    create_command(&pull_cmd, COMMANDLINE_PULL_NAME, COMMANDLINE_PULL_DESC,
+            COMMANDLINE_PULL_DESC_SIZE, COMMANDLINE_PULL_ARG_DESC, pull,
+            COMMANDLINE_PULL_MAX_ARG, COMMANDLINE_PULL_MIN_ARG);
+    prepend(cmd_list, pull_cmd);
 
-    COMMAND* gstate_cmd = NULL;
-    create_command(&gstate_cmd, COMMANDLINE_GSTATE_NAME, COMMANDLINE_GSTATE_DESC,
-            COMMANDLINE_GSTATE_DESC_SIZE, EMPTY_STRING, get_state_serialno, COMMANDLINE_GSTATE_MAX_ARG, COMMANDLINE_GSTATE_MIN_ARG);
-    prepend(cmd_list, gstate_cmd);
+    COMMAND* push_cmd = NULL;
+    create_command(&push_cmd, COMMANDLINE_PUSH_NAME, COMMANDLINE_PUSH_DESC,
+            COMMANDLINE_PUSH_DESC_SIZE, COMMANDLINE_PUSH_ARG_DESC, push,
+            COMMANDLINE_PUSH_MAX_ARG, COMMANDLINE_PUSH_MIN_ARG);
+    prepend(cmd_list, push_cmd);
 
-    COMMAND* gserial_cmd = NULL;
-    create_command(&gserial_cmd, COMMANDLINE_GSERIAL_NAME, COMMANDLINE_GSERIAL_DESC,
-            COMMANDLINE_GSERIAL_DESC_SIZE, EMPTY_STRING, get_state_serialno, COMMANDLINE_GSERIAL_MAX_ARG, COMMANDLINE_GSERIAL_MIN_ARG);
-    prepend(cmd_list, gserial_cmd);
+    COMMAND* disconnect_cmd = NULL;
+    create_command(&disconnect_cmd, COMMANDLINE_DISCONNECT_NAME,
+            COMMANDLINE_DISCONNECT_DESC, COMMANDLINE_DISCONNECT_DESC_SIZE,
+            COMMANDLINE_DISCONNECT_ARG_DESC, __disconnect,
+            COMMANDLINE_DISCONNECT_MAX_ARG, COMMANDLINE_DISCONNECT_MIN_ARG);
+    prepend(cmd_list, disconnect_cmd);
 
-    COMMAND* swindow_cmd = NULL;
-    create_command(&swindow_cmd, COMMANDLINE_SWINDOW_NAME, COMMANDLINE_SWINDOW_DESC,
-            COMMANDLINE_SWINDOW_DESC_SIZE, EMPTY_STRING, status_window, COMMANDLINE_SWINDOW_MAX_ARG, COMMANDLINE_SWINDOW_MIN_ARG);
-    prepend(cmd_list, swindow_cmd);
+    COMMAND* connect_cmd = NULL;
+    create_command(&connect_cmd, COMMANDLINE_CONNECT_NAME,
+            COMMANDLINE_CONNECT_DESC, COMMANDLINE_CONNECT_DESC_SIZE,
+            COMMANDLINE_CONNECT_ARG_DESC, __connect,
+            COMMANDLINE_CONNECT_MAX_ARG, COMMANDLINE_CONNECT_MIN_ARG);
+    prepend(cmd_list, connect_cmd);
 
-    COMMAND* root_cmd = NULL;
-    create_command(&root_cmd, COMMANDLINE_ROOT_NAME, COMMANDLINE_ROOT_DESC,
-            COMMANDLINE_ROOT_DESC_SIZE, COMMANDLINE_ROOT_ARG_DESC, root, COMMANDLINE_ROOT_MAX_ARG, COMMANDLINE_ROOT_MIN_ARG);
-    prepend(cmd_list, root_cmd);
+    COMMAND* devices_cmd = NULL;
+    create_command(&devices_cmd, COMMANDLINE_DEVICES_NAME,
+            COMMANDLINE_DEVICES_DESC, COMMANDLINE_DEVICES_DESC_SIZE,
+            EMPTY_STRING, devices, COMMANDLINE_DEVICES_MAX_ARG,
+            COMMANDLINE_DEVICES_MIN_ARG);
+    prepend(cmd_list, devices_cmd);
 
     COMMAND* launch_cmd = NULL;
-    create_command(&launch_cmd, COMMANDLINE_LAUNCH_NAME, NULL,
-            0, EMPTY_STRING, launch, COMMANDLINE_LAUNCH_MAX_ARG, COMMANDLINE_LAUNCH_MIN_ARG);
+    create_command(&launch_cmd, COMMANDLINE_LAUNCH_NAME, NULL, 0, EMPTY_STRING,
+            launch, COMMANDLINE_LAUNCH_MAX_ARG, COMMANDLINE_LAUNCH_MIN_ARG);
     prepend(cmd_list, launch_cmd);
 
     COMMAND* forkserver_cmd = NULL;
-    create_command(&forkserver_cmd, COMMANDLINE_FORKSERVER_NAME, NULL,
-            0, EMPTY_STRING, forkserver, COMMANDLINE_FORKSERVER_MAX_ARG, COMMANDLINE_FORKSERVER_MIN_ARG);
+    create_command(&forkserver_cmd, COMMANDLINE_FORKSERVER_NAME, NULL, 0,
+            EMPTY_STRING, forkserver, COMMANDLINE_FORKSERVER_MAX_ARG,
+            COMMANDLINE_FORKSERVER_MIN_ARG);
     prepend(cmd_list, forkserver_cmd);
 
     // deprecated
     COMMAND* oprofile_cmd = NULL;
-    create_command(&oprofile_cmd, COMMANDLINE_OPROFILE_NAME, NULL,
-            0, EMPTY_STRING, oprofile, COMMANDLINE_OPROFILE_MAX_ARG, COMMANDLINE_OPROFILE_MIN_ARG);
+    create_command(&oprofile_cmd, COMMANDLINE_OPROFILE_NAME, NULL, 0,
+            EMPTY_STRING, oprofile, COMMANDLINE_OPROFILE_MAX_ARG,
+            COMMANDLINE_OPROFILE_MIN_ARG);
     prepend(cmd_list, oprofile_cmd);
 
     // deprecated
     COMMAND* da_cmd = NULL;
-    create_command(&da_cmd , COMMANDLINE_DA_NAME, NULL,
-            0, EMPTY_STRING, da, COMMANDLINE_DA_MAX_ARG, COMMANDLINE_DA_MIN_ARG);
-    prepend(cmd_list, da_cmd );
+    create_command(&da_cmd, COMMANDLINE_DA_NAME, NULL, 0, EMPTY_STRING, da,
+            COMMANDLINE_DA_MAX_ARG, COMMANDLINE_DA_MIN_ARG);
+    prepend(cmd_list, da_cmd);
 
     COMMAND* profile_cmd = NULL;
-    create_command(&profile_cmd, COMMANDLINE_PROFILE_NAME, NULL,
-            0, EMPTY_STRING, profile, COMMANDLINE_PROFILE_MAX_ARG, COMMANDLINE_PROFILE_MIN_ARG);
+    create_command(&profile_cmd, COMMANDLINE_PROFILE_NAME, NULL, 0,
+            EMPTY_STRING, profile, COMMANDLINE_PROFILE_MAX_ARG,
+            COMMANDLINE_PROFILE_MIN_ARG);
     prepend(cmd_list, profile_cmd);
 
     COMMAND* capability_cmd = NULL;
-    create_command(&capability_cmd, COMMANDLINE_CAPABILITY_NAME, NULL,
-            0, EMPTY_STRING, get_capability, COMMANDLINE_CAPABILITY_MAX_ARG, COMMANDLINE_CAPABILITY_MIN_ARG);
+    create_command(&capability_cmd, COMMANDLINE_CAPABILITY_NAME, NULL, 0,
+            EMPTY_STRING, get_capability, COMMANDLINE_CAPABILITY_MAX_ARG,
+            COMMANDLINE_CAPABILITY_MIN_ARG);
     prepend(cmd_list, capability_cmd);
 
     COMMAND* boot_cmd = NULL;
-       create_command(&boot_cmd, COMMANDLINE_BOOT_NAME, NULL, 0, EMPTY_STRING,
-                       get_boot, COMMANDLINE_BOOT_MAX_ARG, COMMANDLINE_BOOT_MIN_ARG);
-       prepend(cmd_list, boot_cmd);
+    create_command(&boot_cmd, COMMANDLINE_BOOT_NAME, NULL, 0, EMPTY_STRING,
+            get_boot, COMMANDLINE_BOOT_MAX_ARG, COMMANDLINE_BOOT_MIN_ARG);
+    prepend(cmd_list, boot_cmd);
     
-#ifdef SUPPORT_ENCRYPT
-       // encryption command
-    COMMAND* encryption_cmd = NULL;
-       create_command(&encryption_cmd, COMMANDLINE_ENCRYPTION_NAME, COMMANDLINE_ENCRYPTION_DESC, COMMANDLINE_ENCRYPTION_DESC_SIZE, COMMANDLINE_ENCRYPTION_ARG_DESC,
-                       encryption, COMMANDLINE_ENCRYPTION_MAX_ARG, COMMANDLINE_ENCRYPTION_MIN_ARG);
-       prepend(cmd_list, encryption_cmd);
-#endif
+
 }
 
 int process_cmdline(int argc, char** argv) {
@@ -961,11 +1003,14 @@ int process_cmdline(int argc, char** argv) {
 }
 
 static void print_help(LIST_NODE* optlist, LIST_NODE* cmdlist) {
+    char** line;
+    int* len;
+    int lines;
 
-    fprintf(stderr, "Smart Development Bridge %d.%d.%d\n",
+    fprintf(stderr, "\nSmart Development Bridge %d.%d.%d\n",
          SDB_VERSION_MAJOR, SDB_VERSION_MINOR, SDB_VERSION_PATCH);
-    fprintf(stderr, "\n Usage : sdb [option] <command> [parameters]\n\n");
-    fprintf(stderr, " options:\n");
+    fprintf(stderr, "\nSyntax:\n  sdb [target] <command> [parameters]\n\n");
+    fprintf(stderr, "Targets:\n");
 
     LIST_NODE* curptr = optlist;
     int append_len = strlen(HELP_APPEND_STR);
@@ -985,15 +1030,23 @@ static void print_help(LIST_NODE* optlist, LIST_NODE* cmdlist) {
                 snprintf(append_str, append_len - opt_len + 1, "%s", HELP_APPEND_STR);
                 fprintf(stderr, "%s%s", help_str, append_str);
             }
-            int array_len = opt->desc_size;
-            fprintf(stderr, "- %s\n", des[0]);
-            int i = 1;
-            for(; i< array_len; i++) {
-                fprintf(stderr, "%s  %s\n", HELP_APPEND_STR, des[i]);
+
+            lines = strwrap(des[0], HELP_DESCRIPTION_STRING_WIDTH, &line, &len);
+
+            int i;
+            char result[100];
+            for (i = 0; i < lines; i++) {
+                snprintf(result, len[i] + 1, "%s", line[i]);
+                if (i == 0)
+                    fprintf(stderr, "%s\n", result);
+                else
+                    fprintf(stderr, "%s%s\n", HELP_APPEND_STR, result);
             }
+            SAFE_FREE(line);
+            SAFE_FREE(len);
         }
     }
-    fprintf(stderr, "\n commands:\n");
+    fprintf(stderr, "\nCommand & Parameters:\n");
 
     curptr = cmdlist;
     while(curptr != NULL) {
@@ -1001,7 +1054,7 @@ static void print_help(LIST_NODE* optlist, LIST_NODE* cmdlist) {
         curptr = curptr->next_ptr;
         const char** des = cmd->desc;
         if(des != NULL) {
-            snprintf(help_str, append_len*3, "  sdb %s %s", cmd->name, cmd->argdesc);
+            snprintf(help_str, append_len*3, "  %s %s", cmd->name, cmd->argdesc);
             int cmd_len = strlen(help_str);
             if(cmd_len >= append_len) {
                 fprintf(stderr, "%s\n%s", help_str, HELP_APPEND_STR);
@@ -1010,12 +1063,20 @@ static void print_help(LIST_NODE* optlist, LIST_NODE* cmdlist) {
                 snprintf(append_str, append_len - cmd_len + 1, "%s", HELP_APPEND_STR);
                 fprintf(stderr, "%s%s", help_str, append_str);
             }
-            int array_len = cmd->desc_size;
-            fprintf(stderr, "- %s\n", des[0]);
-            int i = 1;
-            for(; i< array_len; i++) {
-                fprintf(stderr, "%s  %s\n", HELP_APPEND_STR, des[i]);
+
+            lines = strwrap(des[0], HELP_DESCRIPTION_STRING_WIDTH, &line, &len);
+
+            int i;
+            char result[100];
+            for (i = 0; i < lines; i++) {
+                snprintf(result, len[i] + 1, "%s", line[i]);
+                if (i == 0)
+                    fprintf(stderr, "%s\n", result);
+                else
+                    fprintf(stderr, "%s%s\n", HELP_APPEND_STR, result);
             }
+            SAFE_FREE(line);
+            SAFE_FREE(len);
         }
     }
 
index d8c5c87d76bef872951b696e218b139736704761..1f0256813de1bae8ef81dbad92ff6794d4e4e2b6 100644 (file)
@@ -27,7 +27,8 @@
 #include "sdb_constants.h"
 
     const char* SDB_LAUNCH_SCRIPT = "/usr/sbin/sdk_launch";
-    const char* HELP_APPEND_STR = "                                ";
+    const char* HELP_APPEND_STR = "                            ";
+    const int HELP_DESCRIPTION_STRING_WIDTH = 52;
 
     const char* EMPTY_STRING = "";
     const char* WHITE_SPACE = " ";
@@ -63,7 +64,7 @@
 
     const char* COMMANDLINE_DEVICES_NAME = "devices";
     const char* COMMANDLINE_DEVICES_DESC[] = {
-            "list all connected devices"
+            "Display a list of all connected target instances."
     };
     const int COMMANDLINE_DEVICES_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_DEVICES_DESC, char*);
     const int COMMANDLINE_DEVICES_MAX_ARG = 0;
 
     const char* COMMANDLINE_DISCONNECT_NAME = "disconnect";
     const char* COMMANDLINE_DISCONNECT_DESC[] = {
-            "disconnect from a TCP/IP device",
-            "port 26101 is used by default if no port number is specified",
-            "using this command with no additional arguments",
-            "will disconnect from all connected TCP/IP devices",
+            "Disconnect from a TCP/IP device. By default, the port 26101 is used if there is no specified port number. If you use this command with no additional arguments, all connected TCP/IP devices are disconnected."
     };
     const int COMMANDLINE_DISCONNECT_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_DISCONNECT_DESC, char*);
-    const char* COMMANDLINE_DISCONNECT_ARG_DESC = "[<host>[:<port>]]";
+    const char* COMMANDLINE_DISCONNECT_ARG_DESC = "[<ip>[:<port>]]";
     const int COMMANDLINE_DISCONNECT_MAX_ARG = 1;
     const int COMMANDLINE_DISCONNECT_MIN_ARG = 0;
 
     const char* COMMANDLINE_CONNECT_NAME = "connect";
     const char* COMMANDLINE_CONNECT_DESC[] = {
-            "connect to a device via TCP/IP",
-            "port 26101 is used by default if no port number is specified"
+            "Connect to a target through TCP/IP."
     };
     const int COMMANDLINE_CONNECT_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_CONNECT_DESC, char*);
-    const char* COMMANDLINE_CONNECT_ARG_DESC = "<host>[:<port>]";
+    const char* COMMANDLINE_CONNECT_ARG_DESC = "[<ip>[:<port>]]";
     const int COMMANDLINE_CONNECT_MAX_ARG = 1;
     const int COMMANDLINE_CONNECT_MIN_ARG = 1;
 
 
     const char* COMMANDLINE_GSERIAL_NAME = "get-serialno";
     const char* COMMANDLINE_GSERIAL_DESC[] = {
-            "print: <serial-number>"
+            "Print the serial number for connecting the target device."
     };
     const int COMMANDLINE_GSERIAL_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_GSERIAL_DESC, char*);
     const int COMMANDLINE_GSERIAL_MAX_ARG = 0;
 
     const char* COMMANDLINE_GSTATE_NAME = "get-state";
     const char* COMMANDLINE_GSTATE_DESC[] = {
-            "print: offline | locked | device"
+            "Print the connection status with the target device: device/offline/locked."
     };
     const int COMMANDLINE_GSTATE_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_GSTATE_DESC, char*);
     const int COMMANDLINE_GSTATE_MAX_ARG = 0;
 
     const char* COMMANDLINE_ROOT_NAME = "root";
     const char* COMMANDLINE_ROOT_DESC[] = {
-            "switch to root or developer account mode",
-            "'on' means to root mode, and vice versa"
+            "Switch between the root and developer account mode. The 'on' value sets the root mode and the 'off' value sets the developer account mode."
     };
     const int COMMANDLINE_ROOT_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_ROOT_DESC, char*);
-    const char* COMMANDLINE_ROOT_ARG_DESC = "<on | off>";
+    const char* COMMANDLINE_ROOT_ARG_DESC = "{on|off}";
     const int COMMANDLINE_ROOT_MAX_ARG = 1;
     const int COMMANDLINE_ROOT_MIN_ARG = 1;
 
     const char* COMMANDLINE_SWINDOW_NAME = "status-window";
     const char* COMMANDLINE_SWINDOW_DESC[] = {
-            "continuously print device status for a specified device"
+            "Print the connection status for a specified device continuously."
     };
     const int COMMANDLINE_SWINDOW_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_SWINDOW_DESC, char*);
     const int COMMANDLINE_SWINDOW_MAX_ARG = 0;
 
     const char* COMMANDLINE_SSERVER_NAME = "start-server";
     const char* COMMANDLINE_SSERVER_DESC[] = {
-            "ensure that there is a server running",
-            "'--only-detect-tizen' means to detect tizen devices only"
+            "Start the server. If [--only-detect-tizen] is specified, the SDB detects only Tizen devices."
     };
     const int COMMANDLINE_SSERVER_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_SSERVER_DESC, char*);
     const char* COMMANDLINE_SSERVER_ARG_DESC = "[--only-detect-tizen]";
 
     const char* COMMANDLINE_KSERVER_NAME = "kill-server";
     const char* COMMANDLINE_KSERVER_DESC[] = {
-            "kill the server if it is running"
+            "Stop the running server."
     };
     const int COMMANDLINE_KSERVER_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_KSERVER_DESC, char*);
     const int COMMANDLINE_KSERVER_MAX_ARG = 0;
 
     const char* COMMANDLINE_HELP_NAME = "help";
     const char* COMMANDLINE_HELP_DESC[] = {
-            "show this help message"
+            "Show the help message."
     };
     const int COMMANDLINE_HELP_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_HELP_DESC, char*);
 
     const char* COMMANDLINE_VERSION_NAME = "version";
     const char* COMMANDLINE_VERSION_DESC[] = {
-            "show version num"
+            "Show the version number."
     };
     const int COMMANDLINE_VERSION_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_VERSION_DESC, char*);
     const int COMMANDLINE_VERSION_MAX_ARG = 0;
 
     const char* COMMANDLINE_DLOG_NAME = "dlog";
     const char* COMMANDLINE_DLOG_DESC[] = {
-            "view device log"
+            "Monitor the content of the device log buffers.\n[-f <filename>] writes the log to the <filename> file. The default file is stdout.\n[-r <Kbytes>] rotates the log file every <Kbytes> of output. The default value is 16. This option also requires the -f option.\n[-n <count>] sets the maximum number of rotated logs to <count>. The default value is 4. This option also requires the -r option.\n[-v <format>] sets the output format (brief/process/tag/thread/raw/time/long) for log messages. The default value of <format> is 'brief'."
     };
     const int COMMANDLINE_DLOG_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_DLOG_DESC, char*);
-    const char* COMMANDLINE_DLOG_ARG_DESC = "[<filter_spec>]";
+    const char* COMMANDLINE_DLOG_ARG_DESC = "[-f <filename>] [-r <Kbytes>] [-n <count>] [-v <format>]";
     const int COMMANDLINE_DLOG_MAX_ARG = -1;
     const int COMMANDLINE_DLOG_MIN_ARG = 0;
 
     const char* COMMANDLINE_FORWARD_NAME = "forward";
     const char* COMMANDLINE_FORWARD_DESC[] = {
-            "forward socket connections",
-            "For example: sdb forward tcp:9999 tcp:9999"
+            "Set up requests' arbitrary port forwarding from the host's local port to the target's remote port."
     };
     const int COMMANDLINE_FORWARD_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_FORWARD_DESC, char*);
     const char* COMMANDLINE_FORWARD_ARG_DESC = "<local> <remote>";
     const int COMMANDLINE_FORWARD_MIN_ARG = 1;
 
     const char* COMMANDLINE_FORWARD_LIST_NAME = "forward --list";
-        const char* COMMANDLINE_FORWARD_LIST_DESC[] = {
-                "list all forward socket connections",
-        };
+    const char* COMMANDLINE_FORWARD_LIST_DESC[] = {
+            "Display a list of all forwarded socket connections."
+    };
     const int COMMANDLINE_FORWARD_LIST_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_FORWARD_LIST_DESC, char*);
     const int COMMANDLINE_FORWARD_LIST_MAX_ARG = 0;
     const int COMMANDLINE_FORWARD_LIST_MIN_ARG = 0;
 
     const char* COMMANDLINE_FORWARD_REMOVE_NAME = "forward --remove";
-        const char* COMMANDLINE_FORWARD_REMOVE_DESC[] = {
-                "remove a specific forward socket connections",
-        };
+    const char* COMMANDLINE_FORWARD_REMOVE_DESC[] = {
+            "Remove the <local> forward socket connection."
+    };
     const int COMMANDLINE_FORWARD_REMOVE_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_FORWARD_REMOVE_DESC, char*);
     const char* COMMANDLINE_FORWARD_REMOVE_ARG_DESC = "<local>";
     const int COMMANDLINE_FORWARD_REMOVE_MAX_ARG = 1;
     const int COMMANDLINE_FORWARD_REMOVE_MIN_ARG = 1;
 
     const char* COMMANDLINE_FORWARD_REMOVE_ALL_NAME = "forward --remove-all";
-        const char* COMMANDLINE_FORWARD_REMOVE_ALL_DESC[] = {
-                "remove all forward socket connections",
-        };
+    const char* COMMANDLINE_FORWARD_REMOVE_ALL_DESC[] = {
+            "Remove all forwarded socket connections."
+    };
     const int COMMANDLINE_FORWARD_REMOVE_ALL_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_FORWARD_REMOVE_ALL_DESC, char*);
     const int COMMANDLINE_FORWARD_REMOVE_ALL_MAX_ARG = 0;
     const int COMMANDLINE_FORWARD_REMOVE_ALL_MIN_ARG = 0;
 
     const char* COMMANDLINE_FORWARDLIST_NAME = "forward-list";
-        const char* COMMANDLINE_FORWARDLIST_DESC[] = {
-                "list forwarding ports",
-        };
+    const char* COMMANDLINE_FORWARDLIST_DESC[] = {
+            "Display a list of all forwarded socket connections."
+    };
     const int COMMANDLINE_FORWARDLIST_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_FORWARDLIST_DESC, char*);
     const int COMMANDLINE_FORWARDLIST_MAX_ARG = 0;
     const int COMMANDLINE_FORWARDLIST_MIN_ARG = 0;
 
     const char* COMMANDLINE_PUSH_NAME = "push";
     const char* COMMANDLINE_PUSH_DESC[] = {
-            "copy file/dir to device",
-            "(--with-utf8 means to create the remote file with utf-8 character encoding)"
+            "Copy a file or directory recursively from the host computer to the target."
     };
     const int COMMANDLINE_PUSH_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_PUSH_DESC, char*);
     const char* COMMANDLINE_PUSH_ARG_DESC = "<local> <remote> [--with-utf8]";
 
     const char* COMMANDLINE_PULL_NAME = "pull";
     const char* COMMANDLINE_PULL_DESC[] = {
-            "copy file/dir from device"
+            "Copy a file or directory recursively from the target to the host computer."
     };
     const int COMMANDLINE_PULL_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_PULL_DESC, char*);
     const char* COMMANDLINE_PULL_ARG_DESC = "<remote> [<local>]";
 
     const char* COMMANDLINE_SHELL_NAME = "shell";
     const char* COMMANDLINE_SHELL_DESC[] = {
-            "if argument is null, run remote shell interactively",
-            "if argument is not null, run command in the remote shell"
+           "Launch the shell on the target instance if the <command> is not specified. If the <command> is specified, this runs the <command> without entering the SDB remote shell on the target instance."
     };
     const int COMMANDLINE_SHELL_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_SHELL_DESC, char*);
     const char* COMMANDLINE_SHELL_ARG_DESC = "[command]";
 
     const char* COMMANDLINE_INSTALL_NAME = "install";
     const char* COMMANDLINE_INSTALL_DESC[] = {
-            "push package file and install it"
+            "Push the tpk package file in the <pkg_path> to the device and install it."
     };
     const int COMMANDLINE_INSTALL_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_INSTALL_DESC, char*);
     const char* COMMANDLINE_INSTALL_ARG_DESC = "<pkg_path>";
 
     const char* COMMANDLINE_UNINSTALL_NAME = "uninstall";
     const char* COMMANDLINE_UNINSTALL_DESC[] = {
-            "uninstall an app from the device",
-            "the <pkg_id> is an unique 10-digit unique identifier for the application. The following command shows an example:",
-            "Ex.) sdb uninstall ko983dw33q"
+            "Uninstall the application from the device by using its pkg-id. The <pkg_id> is a 10-digit unique identifier for the application."
     };
     const int COMMANDLINE_UNINSTALL_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_UNINSTALL_DESC, char*);
     const char* COMMANDLINE_UNINSTALL_ARG_DESC = "<pkg_id>";
     const char* COMMANDLINE_SERIAL_SHORT_OPT = "s";
     const char* COMMANDLINE_SERIAL_LONG_OPT = "serial";
     const char* COMMANDLINE_SERIAL_DESC[] = {
-            "direct command to the USB device or emulator with the given serial number"
+            "Send the <command> to a target through <serial number>."
     };
     const int COMMANDLINE_SERIAL_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_SERIAL_DESC, char*);
     const char* COMMANDLINE_SERIAL_ARG_DESC = "<serial_number>";
     const int COMMANDLINE_SERIAL_HAS_ARG = 1;
 
-    const char* COMMANDLINE_DEVICE_SHORT_OPT = "d";
-    const char* COMMANDLINE_DEVICE_LONG_OPT = "device";
-    const char* COMMANDLINE_DEVICE_DESC[] = {
-            "direct command to the only connected USB device",
-            "return an error if more than one USB device is present"
-    };
-    const int COMMANDLINE_DEVICE_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_DEVICE_DESC, char*);
-    const int COMMANDLINE_DEVICE_HAS_ARG = 0;
-
     const char* COMMANDLINE_EMULATOR_SHORT_OPT = "e";
     const char* COMMANDLINE_EMULATOR_LONG_OPT = "emulator";
     const char* COMMANDLINE_EMULATOR_DESC[] = {
-            "direct command to the only running emulator",
-            "return an error if more than one emulator is running"
+            "Send the <command> to a running emulator instance and returns an error if there are other instances."
     };
     const int COMMANDLINE_EMULATOR_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_EMULATOR_DESC, char*);
     const int COMMANDLINE_EMULATOR_HAS_ARG = 0;
 
+    const char* COMMANDLINE_DEVICE_SHORT_OPT = "d";
+    const char* COMMANDLINE_DEVICE_LONG_OPT = "device";
+    const char* COMMANDLINE_DEVICE_DESC[] = {
+            "Send the <command> to a connected device and returns an error if there are other devices."
+    };
+    const int COMMANDLINE_DEVICE_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_DEVICE_DESC, char*);
+    const int COMMANDLINE_DEVICE_HAS_ARG = 0;
+
     const char* COMMANDLINE_ERROR_ARG_MISSING = "argument %s is missing for command %s";
 
     const char* STATE_OFFLINE = "offline";
 
 #ifdef SUPPORT_ENCRYPT
     const char* COMMANDLINE_ENCRYPTION_NAME = "encryption";
-       const char* COMMANDLINE_ENCRYPTION_ARG_DESC = "<on | off | status>";
+       const char* COMMANDLINE_ENCRYPTION_ARG_DESC = "{on|off|status}";
        const char* COMMANDLINE_ENCRYPTION_DESC[] = {
-            "Set encryption modes for got/sent datas"
+            "Set encryption modes for got/sent data."
     };
     const int COMMANDLINE_ENCRYPTION_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_ENCRYPTION_DESC, char*);
     const int COMMANDLINE_ENCRYPTION_MAX_ARG = 1;
index 91afc3d1478df0da5992270efc1eee72ad3aca88..e5fcc1023fd86d67b4f40e21e5c70753dbc11e16 100644 (file)
@@ -41,6 +41,7 @@ typedef enum host_type HOST_TYPE;
 
     extern const char* SDB_LAUNCH_SCRIPT;
     extern const char* HELP_APPEND_STR;
+    extern const int HELP_DESCRIPTION_STRING_WIDTH;
 
     extern const char* EMPTY_STRING;
     extern const char* WHITE_SPACE;
index 0d8442b2cc2ee4dc34d21e463c203b4cf15beabe..b48445936ea10a352a3d4adbc9e6531ca3f4ae88 100755 (executable)
@@ -164,4 +164,165 @@ char* ltrim(char *s) {
 
     return s;
 }
+
+/*
+  Splits s into multiple lines of width w. Returns the number of
+  lines. line_ret will be set to an array of string pointers, each
+  pointing to the start of a line. len_ret will be set to an array of
+  ints, describing how wide the corresponding line is. If an error
+  occurs 0 is returned; line_ret and len_ret are then left unmodified.
+*/
+int strwrap(char * s, int w, char *** line_ret, int ** len_ret) {
+    int allocated; /* lines allocated */
+    int lines; /* lines used */
+    char ** line;
+    int * len;
+    int tl; /* total length of the string */
+    int l; /* length of current line */
+    int p; /* offset (from s) of current line */
+    int close_word;
+    int open_word;
+    int i;
+
+    if (s == NULL)
+        return 0;
+
+    tl = strlen(s);
+
+    if (tl == 0 || w <= 0)
+        return 0;
+
+    lines = 0;
+
+    /*
+     Preemptively allocate memory. This should be enough for most uses;
+     if we need more we will realloc later.
+     */
+    allocated = (tl / w) * 1.5 + 1;
+
+    line = (char **) malloc(sizeof(char *) * allocated);
+    len = (int *) malloc(sizeof(int) * allocated);
+
+    if (line == NULL || len == NULL)
+        return 0;
+
+    /*
+     p will be an offset from the start of the string and the start of
+     the current line we are processing.
+     */
+
+    p = 0;
+
+    while (p < tl) {
+        /* Detect initial newlines */
+        if (s[p] == '\n') {
+            l = 0;
+            goto make_new_line;
+        }
+
+        /*
+         Fast-forward past initial whitespace on the current line. You
+         might want to comment this out if you need formatting like
+         "  * Bullet point lists" and wish to preserve the spaces.
+         */
+        if (isspace(s[p])) {
+            p++;
+            continue;
+        }
+
+        /*
+         Decide how long the current line should be. We typically want
+         the line to take up the full allowed line width, but we also
+         want to limit the perceived length of the final line. If the
+         line width overshoots the end of the string, truncate it.
+         */
+        if (p + w > tl)
+            w = tl - p;
+
+        l = w;
+
+        /*
+         If the break point ends up within a word, count how many
+         characters of that word fall outside the window to the right.
+         */
+        close_word = 0;
+
+        while (s[p + l + close_word] != '\0' && !isspace(s[p + l + close_word]))
+            close_word++;
+
+        /*
+         Now backtrack from the break point until we find some
+         whitespace. Keep track of how many characters we traverse.
+         */
+        open_word = 0;
+
+        while (s[p + l] != '\0' && !isspace(s[p + l])) {
+            l--;
+            open_word++;
+
+            /*
+             If the current word length is near the line width it will be
+             hard to fit it all on a line, so we should just leave as much
+             of it as possible on this line. Remove the fraction if you
+             only want longer words to break.
+             */
+            if (open_word + close_word > w * 0.8) {
+                l = w;
+                break;
+            }
+        }
+
+        /*
+         We now have a line width we wish to use. Just make a final check
+         there are no newlines in the middle of the line. If there are,
+         break at that point instead.
+         */
+        for (i = 0; i < l; i++) {
+            if (s[p + i] == '\n') {
+                l = i;
+                break;
+            }
+        }
+
+        make_new_line:
+        /*
+         We have decided how long this line should be. Check that we have
+         enough memory reserved for the line pointers; allocate more if
+         needed.
+         */
+
+        line[lines] = &s[p];
+        len[lines] = l;
+        lines++;
+
+        if (lines >= allocated) {
+            allocated *= 2;
+
+            line = (char **) realloc(line, sizeof(char *) * allocated);
+            len = (int *) realloc(len, sizeof(int) * allocated);
+
+            if (line == NULL || len == NULL)
+                return 0;
+        }
+
+        /*
+         Move on to the next line. This needs to be 1 less than the
+         desired width or we will drop characters in the middle of
+         really long words.
+         */
+        if (l == w)
+            l--;
+
+        p += l + 1;
+    }
+
+    /* Finally, relinquish memory we don't need */
+    line = (char **) realloc(line, sizeof(char *) * lines);
+    len = (int *) realloc(len, sizeof(int) * lines);
+
+    *line_ret = line;
+    *len_ret = len;
+
+    return lines;
+}
 //LCOV_EXCL_STOP
index f5f22345c7987dfef03b5ba2672c454aee64d8d7..8aaea4979d90f7561bc80c5f41aff89f2fe91df0 100644 (file)
@@ -14,5 +14,6 @@ char* strlchr(const char*s, int chr);
 char* trim(char *s);
 char* ltrim(char *s);
 void rtrim(char *s);
+int strwrap(char * s, int w, char *** line_ret, int ** len_ret);
 #endif