X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Fcomp_expand.c;h=742fa7c248b256ec8f61596ddd94a7a12be9c5ab;hp=6e79a926b5ac59f33d738523676a3cf654c93449;hb=f344f8539c1543f8cd65a5bb142dbaf23b9421d2;hpb=11ca5f62994c7a14c4e500510bd242e1e721f8be;ds=sidebyside diff --git a/ncurses/tinfo/comp_expand.c b/ncurses/tinfo/comp_expand.c index 6e79a926..742fa7c2 100644 --- a/ncurses/tinfo/comp_expand.c +++ b/ncurses/tinfo/comp_expand.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc. * + * Copyright (c) 1998-2012,2016 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,7 +35,7 @@ #include #include -MODULE_ID("$Id: comp_expand.c,v 1.20 2008/08/16 19:29:42 tom Exp $") +MODULE_ID("$Id: comp_expand.c,v 1.26 2016/09/24 21:15:51 tom Exp $") static int trailing_spaces(const char *src) @@ -46,9 +46,11 @@ trailing_spaces(const char *src) } /* this deals with differences over whether 0x7f and 0x80..0x9f are controls */ -#define REALCTL(s) (UChar(*(s)) < 127 && iscntrl(UChar(*(s)))) +#define REALCTL(s) (UChar(*(s)) < 127 && iscntrl(UChar(*(s)))) #define REALPRINT(s) (UChar(*(s)) < 127 && isprint(UChar(*(s)))) +#define P_LIMIT(p) (length - (size_t)(p)) + NCURSES_EXPORT(char *) _nc_tic_expand(const char *srcp, bool tic_format, int numbers) { @@ -61,15 +63,15 @@ _nc_tic_expand(const char *srcp, bool tic_format, int numbers) size_t need = (2 + strlen(str)) * 4; int ch; -#if NO_LEAKS if (srcp == 0) { +#if NO_LEAKS if (buffer != 0) { FreeAndNull(buffer); length = 0; } +#endif return 0; } -#endif if (buffer == 0 || need > length) { if ((buffer = typeRealloc(char, length = need, buffer)) == 0) return 0; @@ -90,8 +92,9 @@ _nc_tic_expand(const char *srcp, bool tic_format, int numbers) && str[1] != '\\' && REALPRINT(str + 1) && str[2] == S_QUOTE) { - sprintf(buffer + bufp, "{%d}", str[1]); - bufp += strlen(buffer + bufp); + _nc_SPRINTF(buffer + bufp, _nc_SLIMIT(P_LIMIT(bufp)) + "{%d}", str[1]); + bufp += (int) strlen(buffer + bufp); str += 2; } else { buffer[bufp++] = *str; @@ -130,6 +133,8 @@ _nc_tic_expand(const char *srcp, bool tic_format, int numbers) } break; default: + if (*str == ',') /* minitel1 uses this */ + buffer[bufp++] = '\\'; buffer[bufp++] = *str; break; } @@ -177,10 +182,12 @@ _nc_tic_expand(const char *srcp, bool tic_format, int numbers) #define UnCtl(c) ((c) + '@') else if (REALCTL(str) && ch != '\\' && (!islong || isdigit(UChar(str[1])))) { - (void) sprintf(&buffer[bufp], "^%c", UnCtl(ch)); + _nc_SPRINTF(&buffer[bufp], _nc_SLIMIT(P_LIMIT(bufp)) + "^%c", UnCtl(ch)); bufp += 2; } else { - (void) sprintf(&buffer[bufp], "\\%03o", ch); + _nc_SPRINTF(&buffer[bufp], _nc_SLIMIT(P_LIMIT(bufp)) + "\\%03o", ch); bufp += 4; }