/****************************************************************************
- * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2013,2014 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 *
#include <ctype.h>
#include <tic.h>
-MODULE_ID("$Id: lib_tparm.c,v 1.87 2012/10/27 21:28:21 tom Exp $")
+MODULE_ID("$Id: lib_tparm.c,v 1.92 2014/05/23 00:33:45 tom Exp $")
/*
* char *
*
* Cursor addressing and other strings requiring parame-
* ters in the terminal are described by a parameterized string
- * capability, with like escapes %x in it. For example, to
+ * capability, with escapes like %x in it. For example, to
* address the cursor, the cup capability is given, using two
* parameters: the row and column to address to. (Rows and
* columns are numbered from zero and refer to the physical
NCURSES_EXPORT_VAR(int) _nc_tparm_err = 0;
#define TPS(var) _nc_prescreen.tparm_state.var
+#define popcount _nc_popcount /* workaround for NetBSD 6.0 defect */
#if NO_LEAKS
NCURSES_EXPORT(void)
int i;
const char *cp = string;
size_t len2;
+ bool termcap_hack;
+ bool incremented_two;
if (cp == NULL)
return NULL;
if (TPS(fmt_buff) == 0)
return NULL;
+ incremented_two = FALSE;
+
if (number > NUM_PARM)
number = NUM_PARM;
if (popcount > NUM_PARM)
* style, which means tparam() will expand termcap strings OK.
*/
TPS(stack_ptr) = 0;
+ termcap_hack = FALSE;
if (popcount == 0) {
+ termcap_hack = TRUE;
popcount = number;
for (i = number - 1; i >= 0; i--) {
if (p_is_s[i])
break;
case 'l':
- save_number("%d", (int) strlen(spop()), 0);
+ npush((int) strlen(spop()));
break;
case 's':
cp++;
i = (UChar(*cp) - '1');
if (i >= 0 && i < NUM_PARM) {
- if (p_is_s[i])
+ if (p_is_s[i]) {
spush(p_is_s[i]);
- else
+ } else {
npush((int) param[i]);
+ }
}
break;
break;
case 'i':
- if (p_is_s[0] == 0)
- param[0]++;
- if (p_is_s[1] == 0)
- param[1]++;
+ /*
+ * Increment the first two parameters -- if they are numbers
+ * rather than strings. As a side effect, assign into the
+ * stack; if this is termcap, then the stack was populated
+ * using the termcap hack above rather than via the terminfo
+ * 'p' case.
+ */
+ if (!incremented_two) {
+ incremented_two = TRUE;
+ if (p_is_s[0] == 0) {
+ param[0]++;
+ if (termcap_hack)
+ TPS(stack)[0].data.num = (int) param[0];
+ }
+ if (p_is_s[1] == 0) {
+ param[1]++;
+ if (termcap_hack)
+ TPS(stack)[1].data.num = (int) param[1];
+ }
+ }
break;
case '?':