[BACK]Return to cmd-parse.y CVS log [TXT][DIR] Up to [local] / src / usr.bin / tmux

Diff for /src/usr.bin/tmux/cmd-parse.y between version 1.3 and 1.4

version 1.3, 2019/05/23 18:39:00 version 1.4, 2019/05/25 07:18:20
Line 541 
Line 541 
         return (cmds);          return (cmds);
 }  }
   
 struct cmd_parse_result *  static struct cmd_parse_result *
 cmd_parse_from_file(FILE *f, struct cmd_parse_input *pi)  cmd_parse_build_commands(struct cmd_parse_commands *cmds,
       struct cmd_parse_input *pi)
 {  {
         static struct cmd_parse_result   pr;          static struct cmd_parse_result   pr;
         struct cmd_parse_input           input;          struct cmd_parse_commands       *cmds2;
         struct cmd_parse_commands       *cmds, *cmds2;  
         struct cmd_parse_command        *cmd, *cmd2, *next, *next2, *after;          struct cmd_parse_command        *cmd, *cmd2, *next, *next2, *after;
           FILE                            *f;
         u_int                            line = UINT_MAX;          u_int                            line = UINT_MAX;
         int                              i;          int                              i;
         struct cmd_list                 *cmdlist = NULL, *result;          struct cmd_list                 *cmdlist = NULL, *result;
         struct cmd                      *add;          struct cmd                      *add;
         char                            *alias, *cause, *s;          char                            *alias, *cause, *s;
   
         if (pi == NULL) {          /* Check for an empty list. */
                 memset(&input, 0, sizeof input);  
                 pi = &input;  
         }  
         memset(&pr, 0, sizeof pr);  
   
         /*  
          * Parse the file into a list of commands.  
          */  
         cmds = cmd_parse_run_parser(f, pi, &cause);  
         if (cmds == NULL) {  
                 pr.status = CMD_PARSE_ERROR;  
                 pr.error = cause;  
                 return (&pr);  
         }  
         if (TAILQ_EMPTY(cmds)) {          if (TAILQ_EMPTY(cmds)) {
                 free(cmds);                  free(cmds);
                 pr.status = CMD_PARSE_EMPTY;                  pr.status = CMD_PARSE_EMPTY;
Line 678 
Line 665 
 }  }
   
 struct cmd_parse_result *  struct cmd_parse_result *
   cmd_parse_from_file(FILE *f, struct cmd_parse_input *pi)
   {
           static struct cmd_parse_result   pr;
           struct cmd_parse_input           input;
           struct cmd_parse_commands       *cmds;
           char                            *cause;
   
           if (pi == NULL) {
                   memset(&input, 0, sizeof input);
                   pi = &input;
           }
           memset(&pr, 0, sizeof pr);
   
           /*
            * Parse the file into a list of commands.
            */
           cmds = cmd_parse_run_parser(f, pi, &cause);
           if (cmds == NULL) {
                   pr.status = CMD_PARSE_ERROR;
                   pr.error = cause;
                   return (&pr);
           }
           return (cmd_parse_build_commands(cmds, pi));
   }
   
   struct cmd_parse_result *
 cmd_parse_from_string(const char *s, struct cmd_parse_input *pi)  cmd_parse_from_string(const char *s, struct cmd_parse_input *pi)
 {  {
         static struct cmd_parse_result   pr;          static struct cmd_parse_result   pr;
         struct cmd_parse_result         *prp;          struct cmd_parse_result         *prp;
           struct cmd_parse_input           input;
         FILE                            *f;          FILE                            *f;
   
           if (pi == NULL) {
                   memset(&input, 0, sizeof input);
                   pi = &input;
           }
           memset(&pr, 0, sizeof pr);
   
         if (*s == '\0') {          if (*s == '\0') {
                 pr.status = CMD_PARSE_EMPTY;                  pr.status = CMD_PARSE_EMPTY;
                 pr.cmdlist = NULL;                  pr.cmdlist = NULL;
Line 701 
Line 721 
         prp = cmd_parse_from_file(f, pi);          prp = cmd_parse_from_file(f, pi);
         fclose(f);          fclose(f);
         return (prp);          return (prp);
   }
   
   struct cmd_parse_result *
   cmd_parse_from_arguments(int argc, char **argv, struct cmd_parse_input *pi)
   {
           struct cmd_parse_input            input;
           struct cmd_parse_commands        *cmds;
           struct cmd_parse_command         *cmd;
           char                            **copy, **new_argv;
           size_t                            size;
           int                               i, last, new_argc;
   
           /*
            * The commands are already split up into arguments, so just separate
            * into a set of commands by ';'.
            */
   
           if (pi == NULL) {
                   memset(&input, 0, sizeof input);
                   pi = &input;
           }
           cmd_log_argv(argc, argv, "%s", __func__);
   
           cmds = xmalloc(sizeof *cmds);
           TAILQ_INIT(cmds);
           copy = cmd_copy_argv(argc, argv);
   
           last = 0;
           for (i = 0; i < argc; i++) {
                   size = strlen(copy[i]);
                   if (size == 0 || copy[i][size - 1] != ';')
                           continue;
                   copy[i][--size] = '\0';
                   if (size > 0 && copy[i][size - 1] == '\\') {
                           copy[i][size - 1] = ';';
                           continue;
                   }
   
                   new_argc = i - last;
                   new_argv = copy + last;
                   if (size != 0)
                           new_argc++;
   
                   if (new_argc != 0) {
                           cmd_log_argv(new_argc, new_argv, "%s: at %u", __func__,
                               i);
   
                           cmd = xcalloc(1, sizeof *cmd);
                           cmd->name = xstrdup(new_argv[0]);
                           cmd->line = pi->line;
   
                           cmd->argc = new_argc - 1;
                           cmd->argv = cmd_copy_argv(new_argc - 1, new_argv + 1);
   
                           TAILQ_INSERT_TAIL(cmds, cmd, entry);
                   }
   
                   last = i + 1;
           }
           if (last != argc) {
                   new_argv = copy + last;
                   new_argc = argc - last;
   
                   if (new_argc != 0) {
                           cmd_log_argv(new_argc, new_argv, "%s: at %u", __func__,
                               last);
   
                           cmd = xcalloc(1, sizeof *cmd);
                           cmd->name = xstrdup(new_argv[0]);
                           cmd->line = pi->line;
   
                           cmd->argc = new_argc - 1;
                           cmd->argv = cmd_copy_argv(new_argc - 1, new_argv + 1);
   
                           TAILQ_INSERT_TAIL(cmds, cmd, entry);
                   }
           }
           return (cmd_parse_build_commands(cmds, pi));
 }  }
   
 static int printflike(1, 2)  static int printflike(1, 2)

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.4