Now that we have `appname', make much wider use of it. In
[u/mdw/putty] / unix / uxputty.c
index c204787..67364e5 100644 (file)
@@ -3,6 +3,7 @@
  */
 
 #include <stdio.h>
+#include <ctype.h>
 #include <stdlib.h>
 #include <assert.h>
 #include <unistd.h>
 /*
  * TODO:
  * 
- *  - Fix command-line parsing to be more PuTTYlike and not so
- *    ptermy - in particular non-option arguments should be
- *    hostname and port in the obvious way.
- * 
- *  - libcharset enumeration.
- * 
- *  - fix the printer enum (I think the sensible thing is simply to
- *    have uxcfg.c remove the drop-down list completely, since you
- *    can't sensibly provide an enumerated list of lpr commands!).
- * 
- *  - Ctrl+right-click for a context menu (also in Windows for
- *    consistency, I think). This should contain pretty much
- *    everything in the Windows PuTTY menu, and a subset of that in
- *    pterm:
- * 
- *     - Telnet special commands (not in pterm :-)
+ *  - Remainder of the context menu:
  * 
  *     - Event Log (this means we must implement the Event Log; not
  *       in pterm)
  *          to get hold of the application name.
  * 
  *     - Copy All to Clipboard (for what that's worth)
- * 
- *     - Clear Scrollback and Reset Terminal
- * 
- *     - About (and uxcfg.c must also supply the about box)
  */
 
-void cmdline_error(char *p, ...)
-{
-    va_list ap;
-    fprintf(stderr, "plink: ");
-    va_start(ap, p);
-    vfprintf(stderr, p, ap);
-    va_end(ap);
-    fputc('\n', stderr);
-    exit(1);
-}
-
 /*
  * Clean up and exit.
  */
@@ -96,35 +67,6 @@ void cleanup_exit(int code)
     exit(code);
 }
 
-/*
- * Another bunch of temporary stub functions. These ones will want
- * removing by means of implementing them properly: libcharset
- * should invent its own sensible format for codepage names and a
- * means of enumerating them, and printer_enum needs to be dealt
- * with somehow or other too.
- */
-
-char *cp_name(int codepage)
-{
-    return "";
-}
-char *cp_enumerate(int index)
-{
-    return NULL;
-}
-int decode_codepage(char *cp_name)
-{
-    return -2;
-}
-
-printer_enum *printer_start_enum(int *nprinters_ptr) {
-    *nprinters_ptr = 0;
-    return NULL;
-}
-char *printer_get_name(printer_enum *pe, int i) { return NULL;
-}
-void printer_finish_enum(printer_enum *pe) { }
-
 Backend *select_backend(Config *cfg)
 {
     int i;
@@ -144,6 +86,62 @@ int cfgbox(Config *cfg)
     return do_config_box("PuTTY Configuration", cfg);
 }
 
+static int got_host = 0;
+
+int process_nonoption_arg(char *arg, Config *cfg)
+{
+    char *p, *q = arg;
+
+    if (got_host) {
+        /*
+         * If we already have a host name, treat this argument as a
+         * port number. NB we have to treat this as a saved -P
+         * argument, so that it will be deferred until it's a good
+         * moment to run it.
+         */
+        int ret = cmdline_process_param("-P", arg, 1, cfg);
+        assert(ret == 2);
+    } else if (!strncmp(q, "telnet:", 7)) {
+        /*
+         * If the hostname starts with "telnet:",
+         * set the protocol to Telnet and process
+         * the string as a Telnet URL.
+         */
+        char c;
+
+        q += 7;
+        if (q[0] == '/' && q[1] == '/')
+            q += 2;
+        cfg->protocol = PROT_TELNET;
+        p = q;
+        while (*p && *p != ':' && *p != '/')
+            p++;
+        c = *p;
+        if (*p)
+            *p++ = '\0';
+        if (c == ':')
+            cfg->port = atoi(p);
+        else
+            cfg->port = -1;
+        strncpy(cfg->host, q, sizeof(cfg->host) - 1);
+        cfg->host[sizeof(cfg->host) - 1] = '\0';
+        got_host = 1;
+    } else {
+        /*
+         * Otherwise, treat this argument as a host name.
+         */
+        p = arg;
+        while (*p && !isspace((unsigned char)*p))
+            p++;
+        if (*p)
+            *p++ = '\0';
+        strncpy(cfg->host, q, sizeof(cfg->host) - 1);
+        cfg->host[sizeof(cfg->host) - 1] = '\0';
+        got_host = 1;
+    }
+    return 1;
+}
+
 char *make_default_wintitle(char *hostname)
 {
     return dupcat(hostname, " - PuTTY", NULL);