Mercurial > hg > xemacs-beta
diff src/console-x.c @ 444:576fb035e263 r21-2-37
Import from CVS: tag r21-2-37
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:36:19 +0200 |
parents | abe6d1db359e |
children | 183866b06e0b |
line wrap: on
line diff
--- a/src/console-x.c Mon Aug 13 11:35:05 2007 +0200 +++ b/src/console-x.c Mon Aug 13 11:36:19 2007 +0200 @@ -43,31 +43,43 @@ 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) { - Bufbyte *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 - XSTRING_DATA (display); + DEC_CHARPTR (p); + if (charptr_emchar (p) == ':') + { + *hostname_length = p - beg; - dotptr = strchr ((char *) dotptr, '.'); - if (dotptr) - *display_length = (dotptr - 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 @@ -182,11 +194,26 @@ 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 (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); } @@ -262,8 +289,8 @@ split_up_display_spec (connection, &hostname_length, &display_length, &screen_length); - screen_str = build_string (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));