diff options
Diffstat (limited to 'Src/Modules')
-rw-r--r-- | Src/Modules/clone.c | 2 | ||||
-rw-r--r-- | Src/Modules/pcre.c | 33 | ||||
-rw-r--r-- | Src/Modules/zpty.c | 26 |
3 files changed, 43 insertions, 18 deletions
diff --git a/Src/Modules/clone.c b/Src/Modules/clone.c index 5db1c9222..930429248 100644 --- a/Src/Modules/clone.c +++ b/Src/Modules/clone.c @@ -93,7 +93,7 @@ bin_clone(char *nam, char **args, UNUSED(Options ops), UNUSED(int func)) /* Clear mygrp so that acquire_pgrp() gets the new process group. * (acquire_pgrp() is called from init_io()) */ mypgrp = 0; - init_io(); + init_io(NULL); setsparam("TTY", ztrdup(ttystrname)); } close(ttyfd); diff --git a/Src/Modules/pcre.c b/Src/Modules/pcre.c index 2393cd1e7..aa5c8ed5b 100644 --- a/Src/Modules/pcre.c +++ b/Src/Modules/pcre.c @@ -190,18 +190,25 @@ zpcre_get_substrings(char *arg, int *ovec, int ret, char *matchvar, if (want_begin_end) { char *ptr = arg; zlong offs = 0; + int clen, leftlen; /* Count the characters before the match */ - MB_METACHARINIT(); - while (ptr < arg + ovec[0]) { + MB_CHARINIT(); + leftlen = ovec[0]; + while (leftlen) { offs++; - ptr += MB_METACHARLEN(ptr); + clen = MB_CHARLEN(ptr, leftlen); + ptr += clen; + leftlen -= clen; } setiparam("MBEGIN", offs + !isset(KSHARRAYS)); /* Add on the characters in the match */ - while (ptr < arg + ovec[1]) { + leftlen = ovec[1] - ovec[0]; + while (leftlen) { offs++; - ptr += MB_METACHARLEN(ptr); + clen = MB_CHARLEN(ptr, leftlen); + ptr += clen; + leftlen -= clen; } setiparam("MEND", offs + !isset(KSHARRAYS) - 1); if (nelem) { @@ -219,17 +226,23 @@ zpcre_get_substrings(char *arg, int *ovec, int ret, char *matchvar, ptr = arg; offs = 0; /* Find the start offset */ - MB_METACHARINIT(); - while (ptr < arg + ipair[0]) { + MB_CHARINIT(); + leftlen = ipair[0]; + while (leftlen) { offs++; - ptr += MB_METACHARLEN(ptr); + clen = MB_CHARLEN(ptr, leftlen); + ptr += clen; + leftlen -= clen; } convbase(buf, offs + !isset(KSHARRAYS), 10); *bptr = ztrdup(buf); /* Continue to the end offset */ - while (ptr < arg + ipair[1]) { + leftlen = ipair[1] - ipair[0]; + while (leftlen) { offs++; - ptr += MB_METACHARLEN(ptr); + clen = MB_CHARLEN(ptr, leftlen); + ptr += clen; + leftlen -= clen; } convbase(buf, offs + !isset(KSHARRAYS) - 1, 10); *eptr = ztrdup(buf); diff --git a/Src/Modules/zpty.c b/Src/Modules/zpty.c index 3b8366076..63ff7578c 100644 --- a/Src/Modules/zpty.c +++ b/Src/Modules/zpty.c @@ -399,7 +399,7 @@ newptycmd(char *nam, char *pname, char **args, int echo, int nblock) close(master); close(coprocin); close(coprocout); - init_io(); + init_io(NULL); setsparam("TTY", ztrdup(ttystrname)); opts[INTERACTIVE] = 0; @@ -614,14 +614,23 @@ ptyread(char *nam, Ptycmd cmd, char **args, int noblock, int mustmatch) break; } if (cmd->read != -1 || (ret = read(cmd->fd, buf + used, 1)) == 1) { + int readchar; if (cmd->read != -1) { ret = 1; - buf[used] = (char) cmd->read; + readchar = cmd->read; cmd->read = -1; - } + } else + readchar = STOUC(buf[used]); + if (imeta(readchar)) { + buf[used++] = Meta; + buf[used++] = (char) (readchar ^ 32); + } else + buf[used++] = (char) readchar; seen = 1; - if (++used == blen) { + if (used >= blen-1) { if (!*args) { + buf[used] = '\0'; + unmetafy(buf, &used); write_loop(1, buf, used); used = 0; } else { @@ -633,7 +642,8 @@ ptyread(char *nam, Ptycmd cmd, char **args, int noblock, int mustmatch) buf[used] = '\0'; if (!prog) { - if (ret <= 0 || (*args && buf[used - 1] == '\n')) + if (ret <= 0 || (*args && buf[used - 1] == '\n' && + (used < 2 || buf[used-2] != Meta))) break; } else { if (ret < 0 @@ -666,9 +676,11 @@ ptyread(char *nam, Ptycmd cmd, char **args, int noblock, int mustmatch) return 1; } if (*args) - setsparam(*args, ztrdup(metafy(buf, used, META_HREALLOC))); - else if (used) + setsparam(*args, ztrdup(buf)); + else if (used) { + unmetafy(buf, &used); write_loop(1, buf, used); + } if (seen && (!prog || matchok || !mustmatch)) return 0; |