/* Synched up with: Not in FSF. */
+/* This file Mule-ized by Ben Wing, 7-10-00. */
+
/* Authorship:
Ben Wing: January 1996, for 19.14.
#include "lisp.h"
#include "console-x.h"
+#include "buffer.h"
#include "process.h" /* canonicalize_host_name */
#include "redisplay.h" /* for display_arg */
return 1;
}
+/* Parse a DISPLAY specification like "host:10.0" or ":0" */
static void
split_up_display_spec (Lisp_Object display, int *hostname_length,
int *display_length, int *screen_length)
{
- char *dotptr;
+ Bufbyte *beg = XSTRING_DATA (display);
+ Bufbyte *end = beg + XSTRING_LENGTH (display);
+ Bufbyte *p = end;
- dotptr = strrchr ((char *) XSTRING_DATA (display), ':');
- if (!dotptr)
+ while (p > beg)
{
- *hostname_length = XSTRING_LENGTH (display);
- *display_length = 0;
- }
- else
- {
- *hostname_length = dotptr - (char *) XSTRING_DATA (display);
+ DEC_CHARPTR (p);
+ if (charptr_emchar (p) == ':')
+ {
+ *hostname_length = p - beg;
- dotptr = strchr (dotptr, '.');
- if (dotptr)
- *display_length = (dotptr - (char *) XSTRING_DATA (display)
- - *hostname_length);
- else
- *display_length = XSTRING_LENGTH (display) - *hostname_length;
+ while (p < end - 1)
+ {
+ INC_CHARPTR (p);
+ if (charptr_emchar (p) == '.')
+ {
+ *display_length = p - beg - *hostname_length;
+ *screen_length = end - p;
+ return;
+ }
+ }
+ /* No '.' found. */
+ *display_length = XSTRING_LENGTH (display) - *hostname_length;
+ *screen_length = 0;
+ return;
+ }
}
- *screen_length = (XSTRING_LENGTH (display) - *display_length
- - *hostname_length);
+ /* No ':' found. */
+ *hostname_length = XSTRING_LENGTH (display);
+ *display_length = 0;
+ *screen_length = 0;
}
/* Remember, in all of the following functions, we have to verify
static Lisp_Object
get_display_arg_connection (void)
{
- const char *disp_name;
+ const Extbyte *disp_name;
/* If the user didn't explicitly specify a display to use when
they called make-x-device, then we first check to see if a
{
int elt;
int argc;
- char **argv;
+ Extbyte **argv;
Lisp_Object conn;
make_argc_argv (Vx_initial_argv_list, &argc, &argv);
if (elt + 1 == argc)
{
suppress_early_error_handler_backtrace = 1;
- error ("-display specified with no arg");
+ type_error (Qinvalid_argument,
+ "-display specified with no arg");
}
else
{
/* assert: display_arg is only set if we found the display
arg earlier so we can't fail to find it now. */
assert (disp_name != NULL);
- conn = build_ext_string (disp_name, Qctext);
+ conn = build_ext_string (disp_name, Qcommand_argument_encoding);
free_argc_argv (argv);
return conn;
}
else
- return build_ext_string (XDisplayName (0), Qctext);
+ return build_ext_string (XDisplayName (0), Qx_display_name_encoding);
}
/* "semi-canonicalize" means convert to a nicer form for printing, but
connection = x_device_to_console_connection (connection, errb);
/* Check for a couple of standard special cases */
- if (string_byte (XSTRING (connection), 0) == ':')
+ if (string_char (XSTRING (connection), 0) == ':')
connection = concat2 (build_string ("localhost"), connection);
- else if (!strncmp ((const char *) XSTRING_DATA (connection),
- "unix:", 5))
- connection = concat2 (build_string ("localhost:"),
- Fsubstring (connection, make_int (5), Qnil));
+ else
+ {
+ /* connection =~ s/^unix:/localhost:/; */
+ const Bufbyte *p = XSTRING_DATA (connection);
+ const Bufbyte *end = XSTRING_DATA (connection) + XSTRING_LENGTH (connection);
+ size_t i;
+
+ for (i = 0; i < sizeof ("unix:") - 1; i++)
+ {
+ if (p == end || charptr_emchar (p) != "unix:"[i])
+ goto ok;
+ INC_CHARPTR (p);
+ }
+
+ connection = concat2 (build_string ("localhost:"),
+ make_string (p, end - p));
+ }
+ ok:
RETURN_UNGCPRO (connection);
}
split_up_display_spec (connection, &hostname_length, &display_length,
&screen_length);
- screen_str = build_string ((const char *) XSTRING_DATA (connection)
- + hostname_length + display_length);
+ screen_str = make_string (XSTRING_DATA (connection)
+ + hostname_length + display_length, screen_length);
connection = x_canonicalize_console_connection (connection, errb);
RETURN_UNGCPRO (concat2 (connection, screen_str));