diff --git a/ncurses/tinfo/trim_sgr0.c b/ncurses/tinfo/trim_sgr0.c
index 80c8f77..ec5e2b7 100644
--- a/ncurses/tinfo/trim_sgr0.c
+++ b/ncurses/tinfo/trim_sgr0.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 2005-2006,2007 Free Software Foundation, Inc.              *
+ * Copyright (c) 2005-2010,2012 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -35,9 +35,8 @@
 #include <ctype.h>
 
 #include <tic.h>
-#include <term_entry.h>
 
-MODULE_ID("$Id: trim_sgr0.c,v 1.8 2007/04/07 17:14:11 tom Exp $")
+MODULE_ID("$Id: trim_sgr0.c,v 1.15 2012/12/15 20:57:17 tom Exp $")
 
 #undef CUR
 #define CUR tp->
@@ -49,21 +48,28 @@
 static char *
 set_attribute_9(TERMTYPE *tp, int flag)
 {
-    const char *result;
+    const char *value;
+    char *result;
 
-    if ((result = tparm(set_attributes, 0, 0, 0, 0, 0, 0, 0, 0, flag)) == 0)
-	result = "";
-    return strdup(result);
+    value = tparm(set_attributes, 0, 0, 0, 0, 0, 0, 0, 0, flag);
+    if (PRESENT(value))
+	result = strdup(value);
+    else
+	result = 0;
+    return result;
 }
 
 static int
 is_csi(const char *s)
 {
-    if (UChar(s[0]) == CSI)
-	return 1;
-    else if (s[0] == ESC && s[1] == L_BRACK)
-	return 2;
-    return 0;
+    int result = 0;
+    if (s != 0) {
+	if (UChar(s[0]) == CSI)
+	    result = 1;
+	else if (s[0] == ESC && s[1] == L_BRACK)
+	    result = 2;
+    }
+    return result;
 }
 
 static char *
@@ -98,10 +104,10 @@
 static bool
 rewrite_sgr(char *s, char *attr)
 {
-    if (PRESENT(s)) {
+    if (s != 0) {
 	if (PRESENT(attr)) {
-	    unsigned len_s = strlen(s);
-	    unsigned len_a = strlen(attr);
+	    size_t len_s = strlen(s);
+	    size_t len_a = strlen(attr);
 
 	    if (len_s > len_a && !strncmp(attr, s, len_a)) {
 		unsigned n;
@@ -109,7 +115,7 @@
 		for (n = 0; n < len_s - len_a; ++n) {
 		    s[n] = s[n + len_a];
 		}
-		strcpy(s + n, attr);
+		_nc_STRCPY(s + n, attr, strlen(s) + 1);
 		TR(TRACE_DATABASE, ("to:\n\t%s", s));
 	    }
 	}
@@ -122,33 +128,35 @@
 similar_sgr(char *a, char *b)
 {
     bool result = FALSE;
-    int csi_a = is_csi(a);
-    int csi_b = is_csi(b);
-    unsigned len_a;
-    unsigned len_b;
+    if (a != 0 && b != 0) {
+	int csi_a = is_csi(a);
+	int csi_b = is_csi(b);
+	size_t len_a;
+	size_t len_b;
 
-    TR(TRACE_DATABASE, ("similar_sgr:\n\t%s\n\t%s",
-			_nc_visbuf2(1, a),
-			_nc_visbuf2(2, b)));
-    if (csi_a != 0 && csi_b != 0 && csi_a == csi_b) {
-	a += csi_a;
-	b += csi_b;
-	if (*a != *b) {
-	    a = skip_zero(a);
-	    b = skip_zero(b);
+	TR(TRACE_DATABASE, ("similar_sgr:\n\t%s\n\t%s",
+			    _nc_visbuf2(1, a),
+			    _nc_visbuf2(2, b)));
+	if (csi_a != 0 && csi_b != 0 && csi_a == csi_b) {
+	    a += csi_a;
+	    b += csi_b;
+	    if (*a != *b) {
+		a = skip_zero(a);
+		b = skip_zero(b);
+	    }
 	}
+	len_a = strlen(a);
+	len_b = strlen(b);
+	if (len_a && len_b) {
+	    if (len_a > len_b)
+		result = (strncmp(a, b, len_b) == 0);
+	    else
+		result = (strncmp(a, b, len_a) == 0);
+	}
+	TR(TRACE_DATABASE, ("...similar_sgr: %d\n\t%s\n\t%s", result,
+			    _nc_visbuf2(1, a),
+			    _nc_visbuf2(2, b)));
     }
-    len_a = strlen(a);
-    len_b = strlen(b);
-    if (len_a && len_b) {
-	if (len_a > len_b)
-	    result = (strncmp(a, b, len_b) == 0);
-	else
-	    result = (strncmp(a, b, len_a) == 0);
-    }
-    TR(TRACE_DATABASE, ("...similar_sgr: %d\n\t%s\n\t%s", result,
-			_nc_visbuf2(1, a),
-			_nc_visbuf2(2, b)));
     return result;
 }
 
@@ -170,13 +178,13 @@
  * Returns the number of chars from 'full' that we matched.  If any mismatch
  * occurs, return zero.
  */
-static int
+static unsigned
 compare_part(const char *part, const char *full)
 {
     const char *next_part;
     const char *next_full;
-    int used_full = 0;
-    int used_delay = 0;
+    unsigned used_full = 0;
+    unsigned used_delay = 0;
 
     while (*part != 0) {
 	if (*part != *full) {
@@ -199,7 +207,7 @@
 	    next_part = skip_delay(part);
 	    next_full = skip_delay(full);
 	    if (next_part != part && next_full != full) {
-		used_delay += (next_full - full);
+		used_delay += (unsigned) (next_full - full);
 		full = next_full;
 		part = next_part;
 		continue;
@@ -261,10 +269,11 @@
 		k = strlen(exit_alt_charset_mode);
 		if (j > k) {
 		    for (i = 0; i <= (j - k); ++i) {
-			int k2 = compare_part(exit_alt_charset_mode, off + i);
+			unsigned k2 = compare_part(exit_alt_charset_mode,
+						   off + i);
 			if (k2 != 0) {
 			    found = TRUE;
-			    chop_out(off, i, i + k2);
+			    chop_out(off, (unsigned) i, (unsigned) (i + k2));
 			    break;
 			}
 		    }
@@ -274,18 +283,18 @@
 	     * SGR 10 would reset to normal font.
 	     */
 	    if (!found) {
-		if ((i = is_csi(off)) != 0
+		if ((i = (size_t) is_csi(off)) != 0
 		    && off[strlen(off) - 1] == 'm') {
 		    TR(TRACE_DATABASE, ("looking for SGR 10 in %s",
 					_nc_visbuf(off)));
 		    tmp = skip_zero(off + i);
 		    if (tmp[0] == '1'
 			&& skip_zero(tmp + 1) != tmp + 1) {
-			i = tmp - off;
+			i = (size_t) (tmp - off);
 			if (off[i - 1] == ';')
 			    i--;
-			j = skip_zero(tmp + 1) - off;
-			i = chop_out(off, i, j);
+			j = (size_t) (skip_zero(tmp + 1) - off);
+			(void) chop_out(off, (unsigned) i, (unsigned) j);
 			found = TRUE;
 		    }
 		}
@@ -293,10 +302,10 @@
 	    if (!found
 		&& (tmp = strstr(end, off)) != 0
 		&& strcmp(end, off) != 0) {
-		i = tmp - end;
+		i = (size_t) (tmp - end);
 		j = strlen(off);
 		tmp = strdup(end);
-		chop_out(tmp, i, j);
+		chop_out(tmp, (unsigned) i, (unsigned) j);
 		free(off);
 		result = tmp;
 	    }
