Add some extra validation to zlib decompression (primarily to shut up a GCC 4.6
[sgt/putty] / terminal.c
index aaf8705..0ba3060 100644 (file)
@@ -1889,13 +1889,18 @@ static void check_selection(Terminal *term, pos from, pos to)
 static void scroll(Terminal *term, int topline, int botline, int lines, int sb)
 {
     termline *line;
-    int i, seltop, olddisptop, shift;
+    int i, seltop;
+#ifdef OPTIMISE_SCROLL
+    int olddisptop, shift;
+#endif /* OPTIMISE_SCROLL */
 
     if (topline != 0 || term->alt_which != 0)
        sb = FALSE;
 
+#ifdef OPTIMISE_SCROLL
     olddisptop = term->disptop;
     shift = lines;
+#endif /* OPTIMISE_SCROLL */
     if (lines < 0) {
        while (lines < 0) {
            line = delpos234(term->screen, botline);
@@ -3290,8 +3295,8 @@ static void term_out(Terminal *term)
                    }
                    term->termstate = SEEN_CSI;
                } else if (c == ';') {
-                   if (++term->esc_nargs <= ARGS_MAX)
-                       term->esc_args[term->esc_nargs - 1] = ARG_DEFAULT;
+                   if (term->esc_nargs < ARGS_MAX)
+                       term->esc_args[term->esc_nargs++] = ARG_DEFAULT;
                    term->termstate = SEEN_CSI;
                } else if (c < '@') {
                    if (term->esc_query)
@@ -5137,6 +5142,31 @@ void term_scroll(Terminal *term, int rel, int where)
 }
 
 /*
+ * Scroll the scrollback to centre it on the beginning or end of the
+ * current selection, if any.
+ */
+void term_scroll_to_selection(Terminal *term, int which_end)
+{
+    pos target;
+    int y;
+    int sbtop = -sblines(term);
+
+    if (term->selstate != SELECTED)
+       return;
+    if (which_end)
+       target = term->selend;
+    else
+       target = term->selstart;
+
+    y = target.y - term->rows/2;
+    if (y < sbtop)
+       y = sbtop;
+    else if (y > 0)
+       y = 0;
+    term_scroll(term, -1, y);
+}
+
+/*
  * Helper routine for clipme(): growing buffer.
  */
 typedef struct {