# HG changeset patch # User Richard M. Stallman # Date 841622756 0 # Node ID a1290c4159b522d72de9c3f3a090ef227f4da632 # Parent 7e6b741a8b6a4e7d293cc37637358a66197b258e (quote_file_name): New function. (main, both versions): Use quote_file_name. (decode_options): Don't return a value. (main, both versions): Use optind. Don't check for -nowait here. diff -r 7e6b741a8b6a -r a1290c4159b5 lib-src/emacsclient.c --- a/lib-src/emacsclient.c Mon Sep 02 00:03:28 1996 +0000 +++ b/lib-src/emacsclient.c Mon Sep 02 00:05:56 1996 +0000 @@ -56,9 +56,9 @@ }; /* Decode the options from argv and argc. - Return the number of remaining arguments. */ + The global variable `optind' will say how many arguments we used up. */ -int +void decode_options (argc, argv) int argc; char **argv; @@ -92,8 +92,6 @@ print_help_and_exit (); } } - - return argc; } print_help_and_exit () @@ -105,6 +103,39 @@ "Report bugs to bug-gnu-emacs@prep.ai.mit.edu.\n"); exit (1); } + +/* Return a copy of NAME, inserting a \ + before each \, each -, and each space. + Change spaces to underscores, too, so that the + return value never contains a space. */ + +char * +quote_file_name (name) + char *name; +{ + char *copy = (char *) malloc (strlen (name) * 2 + 1); + char *p, *q; + + p = name; + q = copy; + while (*p) + { + if (*p == ' ') + { + *q++ = '\\'; + *q++ = '_'; + p++; + } + else + { + if (*p == '\\' || *p == '-') + *q++ = '\\'; + *q++ = *p++; + } + } + + return copy; +} #if !defined (HAVE_SOCKETS) && !defined (HAVE_SYSVIPC) @@ -143,18 +174,13 @@ struct sockaddr_un server; char *homedir, *cwd, *str; char string[BUFSIZ]; - int args_left; progname = argv[0]; /* Process options. */ - args_left = decode_options (argc, argv); + decode_options (argc, argv); - /* Advance argv and decrement argc for the options that were skipped. */ - argv += argc - args_left; - argc = args_left; - - if (argc < 2) + if (argc - optind < 1) print_help_and_exit (); /* @@ -244,19 +270,11 @@ exit (1); } - for (i = 1; i < argc; i++) + if (nowait) + fprintf (out, "-nowait "); + + for (i = optind; i < argc; i++) { - /* If -nowait or --nowait option is used, - report it to the server. */ - if (!strcmp (argv[i], "-nowait") - || (!strncmp (argv[i], "--nowait", strlen (argv[i])) - && strlen (argv[i]) >= 3)) - { - fprintf (out, "-nowait "); - nowait = 1; - continue; - } - if (*argv[i] == '+') { char *p = argv[i] + 1; @@ -266,7 +284,8 @@ } else if (*argv[i] != '/') fprintf (out, "%s/", cwd); - fprintf (out, "%s ", argv[i]); + + fprintf (out, "%s ", quote_file_name (argv[i])); } fprintf (out, "\n"); fflush (out); @@ -321,13 +340,9 @@ progname = argv[0]; /* Process options. */ - args_left = decode_options (argc, argv); + decode_options (argc, argv); - /* Advance argv and decrement argc for the options that were skipped. */ - argv += argc - args_left; - argc = args_left; - - if (argc < 2) + if (argc - optind < 1) print_help_and_exit (); /* @@ -381,22 +396,22 @@ msgp->mtext[0] = 0; used = 0; - argc--; argv++; + + if (nowait) + { + strcat (msgp->mtext, "-nowait "); + used += 8; + } + + argc -= optind; + argv += optind; + while (argc) { int need_cwd = 0; char *modified_arg = argv[0]; - /* If -nowait or --nowait option is used, - report it to the server. */ - if (!strcmp (modified_arg, "-nowait") - || (!strncmp (modified_arg, "--nowait", strlen (modified_arg)) - && strlen (modified_arg) >= 3)) - { - modified_arg = "-nowait"; - nowait = 1; - } - else if (*modified_arg == '+') + if (*modified_arg == '+') { char *p = modified_arg + 1; while (*p >= '0' && *p <= '9') p++; @@ -406,6 +421,8 @@ else if (*modified_arg != '/') need_cwd = 1; + modified_arg = quote_file_name (modified_arg); + if (need_cwd) used += strlen (cwd); used += strlen (modified_arg) + 1;