summaryrefslogtreecommitdiff
path: root/Src/Modules
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Modules')
-rw-r--r--Src/Modules/clone.c2
-rw-r--r--Src/Modules/pcre.c33
-rw-r--r--Src/Modules/zpty.c26
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;