Make SaneDialogBox and SaneEndDialog use [GS]etWindowLong rather than
[u/mdw/putty] / ldisc.c
diff --git a/ldisc.c b/ldisc.c
index d9335c9..e572718 100644 (file)
--- a/ldisc.c
+++ b/ldisc.c
 
 #include "putty.h"
 #include "terminal.h"
+#include "ldisc.h"
 
-typedef struct ldisc_tag {
-    Terminal *term;
-    Backend *back;
-    void *backhandle;
-    void *frontend;
-
-    char *buf;
-    int buflen, bufsiz, quotenext;
-} *Ldisc;
-
-#define ECHOING (cfg.localecho == LD_YES || \
-                 (cfg.localecho == LD_BACKEND && \
+#define ECHOING (ldisc->cfg->localecho == FORCE_ON || \
+                 (ldisc->cfg->localecho == AUTO && \
                       (ldisc->back->ldisc(ldisc->backhandle, LD_ECHO) || \
                           term_ldisc(ldisc->term, LD_ECHO))))
-#define EDITING (cfg.localedit == LD_YES || \
-                 (cfg.localedit == LD_BACKEND && \
+#define EDITING (ldisc->cfg->localedit == FORCE_ON || \
+                 (ldisc->cfg->localedit == AUTO && \
                       (ldisc->back->ldisc(ldisc->backhandle, LD_EDIT) || \
                           term_ldisc(ldisc->term, LD_EDIT))))
 
 static void c_write(Ldisc ldisc, char *buf, int len)
 {
-    from_backend(ldisc->term, 0, buf, len);
+    from_backend(ldisc->frontend, 0, buf, len);
 }
 
 static int plen(Ldisc ldisc, unsigned char c)
@@ -48,7 +39,7 @@ static int plen(Ldisc ldisc, unsigned char c)
 static void pwrite(Ldisc ldisc, unsigned char c)
 {
     if ((c >= 32 && c <= 126) || (c >= 160 && !in_utf(ldisc->term))) {
-       c_write(ldisc, &c, 1);
+       c_write(ldisc, (char *)&c, 1);
     } else if (c < 128) {
        char cc[2];
        cc[1] = (c == 127 ? '?' : c + 0x40);
@@ -70,17 +61,18 @@ static void bsb(Ldisc ldisc, int n)
 #define CTRL(x) (x^'@')
 #define KCTRL(x) ((x^'@') | 0x100)
 
-void *ldisc_create(Terminal *term,
+void *ldisc_create(Config *mycfg, Terminal *term,
                   Backend *back, void *backhandle,
                   void *frontend)
 {
-    Ldisc ldisc = smalloc(sizeof(*ldisc));
+    Ldisc ldisc = snew(struct ldisc_tag);
 
     ldisc->buf = NULL;
     ldisc->buflen = 0;
     ldisc->bufsiz = 0;
     ldisc->quotenext = 0;
 
+    ldisc->cfg = mycfg;
     ldisc->back = back;
     ldisc->backhandle = backhandle;
     ldisc->term = term;
@@ -95,6 +87,19 @@ void *ldisc_create(Terminal *term,
     return ldisc;
 }
 
+void ldisc_free(void *handle)
+{
+    Ldisc ldisc = (Ldisc) handle;
+
+    if (ldisc->term)
+       ldisc->term->ldisc = NULL;
+    if (ldisc->back)
+       ldisc->back->provide_ldisc(ldisc->backhandle, NULL);
+    if (ldisc->buf)
+       sfree(ldisc->buf);
+    sfree(ldisc);
+}
+
 void ldisc_send(void *handle, char *buf, int len, int interactive)
 {
     Ldisc ldisc = (Ldisc) handle;
@@ -159,8 +164,8 @@ void ldisc_send(void *handle, char *buf, int len, int interactive)
                        bsb(ldisc, plen(ldisc, ldisc->buf[ldisc->buflen - 1]));
                    ldisc->buflen--;
                    if (ldisc->buflen > 0 &&
-                       isspace(ldisc->buf[ldisc->buflen - 1]) &&
-                       !isspace(ldisc->buf[ldisc->buflen]))
+                       isspace((unsigned char)ldisc->buf[ldisc->buflen-1]) &&
+                       !isspace((unsigned char)ldisc->buf[ldisc->buflen]))
                        break;
                }
                break;
@@ -179,7 +184,7 @@ void ldisc_send(void *handle, char *buf, int len, int interactive)
                  * configured telnet specials off! This breaks
                  * talkers otherwise.
                  */
-                if (!cfg.telnet_keyboard)
+                if (!ldisc->cfg->telnet_keyboard)
                     goto default_case;
                if (c == CTRL('C'))
                    ldisc->back->special(ldisc->backhandle, TS_IP);
@@ -231,7 +236,7 @@ void ldisc_send(void *handle, char *buf, int len, int interactive)
                 *    default clause because of the break.
                 */
              case CTRL('J'):
-               if (cfg.protocol == PROT_RAW &&
+               if (ldisc->cfg->protocol == PROT_RAW &&
                    ldisc->buflen > 0 && ldisc->buf[ldisc->buflen - 1] == '\r') {
                    if (ECHOING)
                        bsb(ldisc, plen(ldisc, ldisc->buf[ldisc->buflen - 1]));
@@ -240,9 +245,9 @@ void ldisc_send(void *handle, char *buf, int len, int interactive)
              case KCTRL('M'):         /* send with newline */
                    if (ldisc->buflen > 0)
                        ldisc->back->send(ldisc->backhandle, ldisc->buf, ldisc->buflen);
-                   if (cfg.protocol == PROT_RAW)
+                   if (ldisc->cfg->protocol == PROT_RAW)
                        ldisc->back->send(ldisc->backhandle, "\r\n", 2);
-                   else if (cfg.protocol == PROT_TELNET && cfg.telnet_newline)
+                   else if (ldisc->cfg->protocol == PROT_TELNET && ldisc->cfg->telnet_newline)
                        ldisc->back->special(ldisc->backhandle, TS_EOL);
                    else
                        ldisc->back->send(ldisc->backhandle, "\r", 1);
@@ -256,7 +261,7 @@ void ldisc_send(void *handle, char *buf, int len, int interactive)
                 default_case:
                if (ldisc->buflen >= ldisc->bufsiz) {
                    ldisc->bufsiz = ldisc->buflen + 256;
-                   ldisc->buf = srealloc(ldisc->buf, ldisc->bufsiz);
+                   ldisc->buf = sresize(ldisc->buf, ldisc->bufsiz, char);
                }
                ldisc->buf[ldisc->buflen++] = c;
                if (ECHOING)
@@ -276,27 +281,27 @@ void ldisc_send(void *handle, char *buf, int len, int interactive)
        if (len > 0) {
            if (ECHOING)
                c_write(ldisc, buf, len);
-           if (keyflag && cfg.protocol == PROT_TELNET && len == 1) {
+           if (keyflag && ldisc->cfg->protocol == PROT_TELNET && len == 1) {
                switch (buf[0]) {
                  case CTRL('M'):
-                   if (cfg.protocol == PROT_TELNET && cfg.telnet_newline)
+                   if (ldisc->cfg->protocol == PROT_TELNET && ldisc->cfg->telnet_newline)
                        ldisc->back->special(ldisc->backhandle, TS_EOL);
                    else
                        ldisc->back->send(ldisc->backhandle, "\r", 1);
                    break;
                  case CTRL('?'):
                  case CTRL('H'):
-                   if (cfg.telnet_keyboard) {
+                   if (ldisc->cfg->telnet_keyboard) {
                        ldisc->back->special(ldisc->backhandle, TS_EC);
                        break;
                    }
                  case CTRL('C'):
-                   if (cfg.telnet_keyboard) {
+                   if (ldisc->cfg->telnet_keyboard) {
                        ldisc->back->special(ldisc->backhandle, TS_IP);
                        break;
                    }
                  case CTRL('Z'):
-                   if (cfg.telnet_keyboard) {
+                   if (ldisc->cfg->telnet_keyboard) {
                        ldisc->back->special(ldisc->backhandle, TS_SUSP);
                        break;
                    }