Module Name:    src
Committed By:   riz
Date:           Thu Mar 14 15:48:29 UTC 2013

Modified Files:
        src/lib/libterminfo [netbsd-6]: Makefile.hash genman term.h
            term_private.h terminfo.3 terminfo.5.in tparm.c
        src/usr.bin/tput [netbsd-6]: Makefile tput.c

Log Message:
Pull up following revision(s) (requested by roy in ticket #835):
        lib/libterminfo/terminfo.3: revision 1.9
        lib/libterminfo/term.h: revision 1.13
        lib/libterminfo/term.h: revision 1.14
        usr.bin/tput/Makefile: revision 1.11
        lib/libterminfo/terminfo.3: revision 1.10
        lib/libterminfo/genman: revision 1.5
        lib/libterminfo/term_private.h: revision 1.11
        usr.bin/tput/tput.c: revision 1.23
        usr.bin/tput/tput.c: revision 1.24
        usr.bin/tput/tput.c: revision 1.25
        lib/libterminfo/tparm.c: revision 1.11
        lib/libterminfo/Makefile.hash: revision 1.7
        usr.bin/tput/tput.c: revision 1.26
        lib/libterminfo/tparm.c: revision 1.12
        lib/libterminfo/tparm.c: revision 1.13
        lib/libterminfo/tparm.c: revision 1.14
        lib/libterminfo/terminfo.5.in: revision 1.18
As tparm accepts longs we should treat them as long during expansion.
Also, fix the ~ and ! logic.
Move the strings vs long analysis to a private function, but allow
tput(1) to use it so we can work with string parameters to
capabilities.
Fix building our terminals with a non standard NETBSDSRCDIR, PR
lib/46793.
Thanks to Bernd Ernesti.
Remove debug accidently commited.
If char * > long then print a suitable error when passing a string
parameter.
For platforms where we cannot fit a char * into a long, return NULL
and set errno to ENOTSUPP.
Add descriptions for terminfo keys to term.h
These are extracted by genman and placed into the compiled terminfo.5
Fixes PR lib/47090
Provide a disabled implentation of tlparm and ti_tlparm for
completeness.
This also improves the readability of _ti_tiparm.
Use putp(3) to output our strings.
Fixes PR lib/47532


To generate a diff of this commit:
cvs rdiff -u -r1.4.4.1 -r1.4.4.2 src/lib/libterminfo/Makefile.hash
cvs rdiff -u -r1.4 -r1.4.8.1 src/lib/libterminfo/genman
cvs rdiff -u -r1.10.4.2 -r1.10.4.3 src/lib/libterminfo/term.h
cvs rdiff -u -r1.9.4.1 -r1.9.4.2 src/lib/libterminfo/term_private.h
cvs rdiff -u -r1.8 -r1.8.4.1 src/lib/libterminfo/terminfo.3
cvs rdiff -u -r1.15.6.1 -r1.15.6.2 src/lib/libterminfo/terminfo.5.in
cvs rdiff -u -r1.7.4.2 -r1.7.4.3 src/lib/libterminfo/tparm.c
cvs rdiff -u -r1.10 -r1.10.8.1 src/usr.bin/tput/Makefile
cvs rdiff -u -r1.22 -r1.22.4.1 src/usr.bin/tput/tput.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libterminfo/Makefile.hash
diff -u src/lib/libterminfo/Makefile.hash:1.4.4.1 src/lib/libterminfo/Makefile.hash:1.4.4.2
--- src/lib/libterminfo/Makefile.hash:1.4.4.1	Sat Jun 23 22:54:57 2012
+++ src/lib/libterminfo/Makefile.hash	Thu Mar 14 15:48:29 2013
@@ -1,6 +1,7 @@
-#	$NetBSD: Makefile.hash,v 1.4.4.1 2012/06/23 22:54:57 riz Exp $
+#	$NetBSD: Makefile.hash,v 1.4.4.2 2013/03/14 15:48:29 riz Exp $
 
 SCRIPT_ENV=	\
+	NETBSDSRCDIR=${NETBSDSRCDIR:Q} \
 	TOOL_AWK=${TOOL_AWK:Q} \
 	TOOL_NBPERF=${TOOL_NBPERF:Q} \
 	TOOL_SED=${TOOL_SED:Q} \

Index: src/lib/libterminfo/genman
diff -u src/lib/libterminfo/genman:1.4 src/lib/libterminfo/genman:1.4.8.1
--- src/lib/libterminfo/genman:1.4	Tue Oct 12 12:57:51 2010
+++ src/lib/libterminfo/genman	Thu Mar 14 15:48:29 2013
@@ -1,7 +1,7 @@
 #!/bin/sh
-# $NetBSD: genman,v 1.4 2010/10/12 12:57:51 christos Exp $
+# $NetBSD: genman,v 1.4.8.1 2013/03/14 15:48:29 riz Exp $
 
-# Copyright (c) 2009 The NetBSD Foundation, Inc.
+# Copyright (c) 2009, 2013 The NetBSD Foundation, Inc.
 #
 # This code is derived from software contributed to The NetBSD Foundation
 # by Roy Marples.
@@ -47,7 +47,8 @@ gentab()
 	$ti | $TOOL_SORT | while read name code foo; do
 		cap=$($TOOL_SED -ne "s/.*{ \"\(..\)\", TICODE_$code }.*/\1/p" \
 		    $tc | head -n 1)
-		echo ".It Li \"$name\" Ta Sy \"\\&$code\" Ta Sy \"\\&$cap\""
+		desc=$($TOOL_SED -ne "s/ \* $name\: \(.*\)/\1/p" $ti)
+		echo ".It \"\\&$name\" Ta Sy \"\\&$code\" Ta Sy \"\\&$cap\" Ta \"\\&$desc\""
 	done
 }
 

Index: src/lib/libterminfo/term.h
diff -u src/lib/libterminfo/term.h:1.10.4.2 src/lib/libterminfo/term.h:1.10.4.3
--- src/lib/libterminfo/term.h:1.10.4.2	Mon Jun 11 17:48:37 2012
+++ src/lib/libterminfo/term.h	Thu Mar 14 15:48:28 2013
@@ -1,7 +1,7 @@
-/* $NetBSD: term.h,v 1.10.4.2 2012/06/11 17:48:37 riz Exp $ */
+/* $NetBSD: term.h,v 1.10.4.3 2013/03/14 15:48:28 riz Exp $ */
 
 /*
- * Copyright (c) 2009, 2010, 2011 The NetBSD Foundation, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2013 The NetBSD Foundation, Inc.
  *
  * This code is derived from software contributed to The NetBSD Foundation
  * by Roy Marples.
@@ -153,6 +153,48 @@ enum TIFLAGS {
 #define transparent_underline		t_transparent_underline(cur_term)
 #define xon_xoff			t_xon_xoff(cur_term)
 
+/*
+ * BOOLEAN DESCRIPTIONS
+ *
+ * auto_left_margin: cub1 wraps from column 0 to last column
+ * auto_right_margin: Terminal has automatic margins
+ * back_color_erase: Screen erased with background colour
+ * can_change: Terminal can re-define existing colour
+ * ceol_standout_glitch: Standout not erased by overwriting (hp)
+ * col_addr_glitch: Only positive motion for hpa/mhba caps
+ * cpi_changes_res: Changing character pitch changes resolution
+ * cr_cancels_micro_mode: Using cr turns off micro mode
+ * dest_tabs_magic_smso: Destructive tabs, magic smso char (t1061)
+ * eat_newline_glitch: Newline ignored after 80 columns (Concept)
+ * erase_overstrike: Can erase overstrikes with a blank line
+ * generic_type: Generic line type (e.g. dialup, switch)
+ * hard_copy: Hardcopy terminal
+ * hard_cursor: Cursor is hard to see
+ * has_meta_key: Has a meta key (shift, sets parity bit)
+ * has_print_wheel: Printer needs operator to change character set
+ * has_status_line: Has extra "status line"
+ * hue_light_saturation: Terminal only uses HLS colour notion (Tektronix)
+ * insert_null_glitch: Insert mode distinguishes nulls
+ * lpi_changes_yes: Changing line pitch changes resolution
+ * memory_above: Display may be retained above the screen
+ * memory_below: Display may be retained below the screen
+ * move_insert_mode: Safe to move while in insert mode
+ * move_standout_mode: Safe to move in standout modes
+ * needs_xon_xoff: Padding won't work, xon/xoff required
+ * no_esc_ctlc: Beehive (f1=escape, f2=ctrl C)
+ * no_pad_char: Pad character doesn't exist
+ * non_dest_scroll_region: Scrolling region is nondestructive
+ * non_rev_rmcup: smcup does not reverse rmcup
+ * over_strike: Terminal overstrikes on hard-copy terminal
+ * prtr_silent: Printer won't echo on screen
+ * row_addr_glitch: Only positive motion for vpa/mvpa caps
+ * semi_auto_right_margin: Printing in last column causes cr
+ * status_line_esc_ok: Escape can be used on the status line
+ * tilde_glitch: Hazeltine; can't print tilde (~)
+ * transparent_underline: Underline character overstrikes
+ * xon_xoff: Terminal uses xon/xoff handshaking
+*/
+
 /* Define available terminfo numbers */
 enum TINUMS {
 	TICODE_bitwin,
@@ -259,6 +301,44 @@ enum TINUMS {
 #define wide_char_size			 t_wide_char_size(cur_term)
 #define width_status_line		 t_width_status_line(cur_term)
 
+/*
+ * NUMBER DESCRIPTIONS
+ *
+ * bit_image_entwining: Number of passes for each bit-map row
+ * bit_image_type: Type of bit image device
+ * buffer_capacity: Number of bytes buffered before printing
+ * buttons: Number of buttons on the mouse
+ * columns: Number of columns in a line
+ * dot_horz_spacing: Spacing of dots horizontally in dots per inch
+ * dot_vert_spacing: Spacing of pins vertically in pins per inch
+ * init_tabs: Tabs initially every #1 spaces
+ * label_height: Number of rows in each label
+ * label_width: Numbre of columns in each label
+ * lines: Number of lines on a screen or a page
+ * lines_of_memory: Lines of memory of > lines; 0 means varies
+ * max_attributes: Maximum combined video attributes terminal can display
+ * magic_cookie_glitch: Number of blank characters left by smso or rmso
+ * max_colors: Maximum number of colours on the screen
+ * max_micro_address: Maximum value in micro_..._addresss
+ * max_micro_jump: Maximum value in parm_..._micro
+ * max_pairs: Maximum number of colour-pairs on the screen
+ * maximum_windows: Maximum number of definable windows
+ * micro_col_size: Character step size when in micro mode
+ * micro_line_size: Line step size when in micro mode
+ * no_color_video: Video attributes that can't be used with colours
+ * num_labels: Number of labels on screen (start at 1)
+ * number_of_pins: Number of pins in print-head
+ * output_res_char: Horizontal resolution in units per character
+ * output_res_line: Vertical resolution in units per line
+ * output_res_horz_inch: Horizontal resolution in units per inch
+ * output_res_vert_inch: Vertical resolution in units per inch
+ * padding_baud_rate: Lowest baud rate where padding needed
+ * print_rate: Print rate in characters per second
+ * virtual_terminal: Virtual terminal number
+ * wide_char_size: Character step size when in double-wide mode
+ * width_status_line: Number of columns in status line
+ */
+
 /* Define available terminfo strings */
 enum TISTRS{
 	TICODE_acsc,
@@ -1448,6 +1528,405 @@ enum TISTRS{
 #define xon_character			 t_xon_character(cur_term)
 #define zero_motion			 t_zero_motion(cur_term)
 
+/*
+ * STRING DESCRIPTIONS
+ *
+ * acs_chars: Graphic charset pairs aAbBcC
+ * alt_scancode_esc: Alternate escape for scancode emulation
+ * back_tab: Back tab
+ * bell: Audible signal (bell)
+ * bit_image_carriage_return: Move to beginning of same row
+ * bit_image_newline: Move to next row of the bit image
+ * bit_image_repeat: Repeat bit-image cell #1 #2 times
+ * carriage_return: Carriage return
+ * change_char_pitch: Change number of characters per inch
+ * change_line_pitch: Change number of lines per inch
+ * change_res_horz: Change horizontal resolution
+ * change_res_vert: Change vertical resolution
+ * change_scroll_region: Change to lines #1 through #2 (VT100)
+ * char_padding: Like ip but when in replace mode
+ * char_set_names: Returns a list of character set names
+ * clear_all_tabs: Clear all tab stops
+ * clear_margins: Clear all margins (top, bottom and sides)
+ * clear_screen: Clear screen and home cursor
+ * clr_bol: Clear to beginning of line, inclusive
+ * clr_eol: Clear to end of line
+ * clr_eos: Clear to end of display
+ * code_set_init: Init sequence for multiple codesets
+ * color_names: Give name for colour #1
+ * column_address: Set horizontal position to absolute #1
+ * command_character: Terminal settable cmd character in prototype
+ * create_window: Define win #1 to go from #2,#3 to #4,#5
+ * cursor_address: Move to row #1, col #2
+ * cursor_down: Down one line
+ * cursor_home: Home cursor (if no cup)
+ * cursor_invisible: Make cursor invisible
+ * cursor_left: Move left one space
+ * cursor_mem_address: Memory relative cursor addressing
+ * cursor_normal: Make cursor appear normal (under vs/vi)
+ * cursor_right: Non-destructive space (cursor or carriage right)
+ * cursor_to_ll: Last line, first column (if no cup)
+ * cursor_up: Upline (cursor up)
+ * cursor_visible: Make cursor very visible
+ * define_bit_image_region: Define rectangular bit-image region
+ * define_char: Define a character in a character set
+ * delete_character: Delete character
+ * delete_line: Delete line
+ * device_type: Indicate language/codeset support
+ * dial_phone: Dial phone number #1
+ * dis_status_line: Disable status line
+ * display_clock: Display time-of-day clock
+ * display_pc_char: Display PC character
+ * down_half_time: Half-line down (forward 1/2 linefeed)
+ * ena_acs: Enable alternate character set
+ * end_bit_image_region: End a bit-image region
+ * enter_alt_charset_mode: Start alternate character set
+ * enter_am_mode: Turn on automatic margins
+ * enter_blink_mode: Turn on blinking
+ * enter_bold_mode: Turn on bold (extra bright) mode
+ * enter_ca_mode: String to begin programs that use cup
+ * enter_delete_mode: Delete mode (enter)
+ * enter_dim_mode: Turn on half-bright mode
+ * enter_doublewide_mode: Enable double wide printing
+ * enter_draft_quality: Set draft qualify print
+ * enter_horizontal_hl_mode: Turn on horizontal highlight mode
+ * enter_insert_mode: Insert mode (enter)
+ * enter_italics_mode: Enable italics
+ * enter_left_hl_mode: Turn on left highlight mode
+ * enter_leftward_mode: Enable leftward carriage motion
+ * enter_low_hl_mode: Turn on low highlight mode
+ * enter_micro_mode: Enable micro motion capabilities
+ * enter_near_quality_letter: Set near-letter quality print
+ * enter_normal_quality: Set normal quality print
+ * enter_pc_charset_mode: Enter PC character display mode
+ * enter_protected_mode: Turn on protected mode
+ * enter_reverse_mode: Turn on reverse video mode
+ * enter_right_hl_mode: Turn on right highlight mode
+ * enter_scancode_mode: Enter PC scancode mode
+ * enter_secure_mode: Turn on blank mode (characters invisible)
+ * enter_shadow_mode: Enable shadow printing
+ * enter_standout_mode: Begin standout mode
+ * enter_subscript_mode: Enable subscript printing
+ * enter_superscript_mode: Enable superscript printing
+ * enter_top_hl_mode: Turn on top highlight mode
+ * enter_underline_mode: Start underscore mode
+ * enter_upward_mode: Enable upward carriage motion
+ * enter_vertical_hl_mode: Turn on verticle highlight mode
+ * enter_xon_mode: Turn on xon/xoff handshaking
+ * erase_chars: Erase #1 characters
+ * exit_alt_charset_mode: End alternate character set
+ * exit_am_mode: Turn off automatic margins
+ * exit_attribute_mode: Turn off all attributes
+ * exit_ca_mode: String to end programs that use cup
+ * exit_delete_mode: End delete mode
+ * exit_doublewide_mode: Disable double wide printing
+ * exit_insert_mode: End insert mode
+ * exit_italics_mode: Disable italics
+ * exit_leftward_mode: Enable rightward (normal) carriage motion
+ * exit_micro_mode: Disable micro motion capabilities
+ * exit_pc_charset_mode: Disable PC character display mode
+ * exit_scancode_mode: Disable PC scancode mode
+ * exit_shadow_mode: Disable shadow printing
+ * exit_standout_mode: End standout mode
+ * exit_subscript_mode: Disable subscript printing
+ * exit_superscript_mode: Disable superscript printing
+ * exit_underline_mode: End underscore mode
+ * exit_upward_mode: Enable downward (normal) carriage motion
+ * exit_xon_mode: Turn off xon/xoff handshaking
+ * fixed_pause: Pause for 2-3 seconds
+ * flash_hook: Flash the switch hook
+ * flash_screen: Visible bell (may move cursor)
+ * form_feed: Hardcopy terminal eject page
+ * from_status_line: Return from status line
+ * get_mouse: Curses should get button events
+ * goto_window: Go to window #1
+ * hangup: Hang-up phone
+ * init_1string: Terminal or printer initialisation string
+ * init_2string: Terminal or printer initialisation string
+ * init_3string: Terminal or printer initialisation string
+ * init_file: Name of initialisation file
+ * init_prog: Path name of program for initialisation
+ * initialize_color: Set colour #1 to RGB #2, #3, #4
+ * initialize_pair: Set colour-pair #1 to fg #2, bg #3
+ * insert_character: Insert character
+ * insert_line: Add new blank line
+ * insert_padding: Insert pad after character inserted
+ * key_a1: upper left of keypad
+ * key_a3: upper right of keypad
+ * key_b2: center of keypad
+ * key_backspace: set by backspace key
+ * key_beg: 1
+ * key_btab: sent by back-tab key
+ * key_c1: lower left of keypad
+ * key_c3: lower right of keypad
+ * key_cancel: 2
+ * key_catab: sent by clear-all-tabs key
+ * key_clear: sent by clear-screen or erase key
+ * key_close: 3
+ * key_command: 4
+ * key_copy: 5
+ * key_create: 6
+ * key_ctab: sent by clear-tab key
+ * key_dc: sent by delete-character key
+ * key_dl: sent by delete-line key
+ * key_down: sent by terminal down-arrow key
+ * key_eic: sent by rmir or smir in insert mode
+ * key_end: 7
+ * key_enter: 8
+ * key_eol: sent by clear-to-end-of-line key
+ * key_eos: sent by clear-to-end-of-screen key
+ * key_exit: 9
+ * key_f0: sent by function key f0
+ * key_f1: sent by function key f1
+ * key_f2: sent by function key f2
+ * key_f3: sent by function key f3
+ * key_f4: sent by function key f4
+ * key_f5: sent by function key f5
+ * key_f6: sent by function key f6
+ * key_f7: sent by function key f7
+ * key_f8: sent by function key f8
+ * key_f9: sent by function key f9
+ * key_f10: sent by function key f10
+ * key_f11: sent by function key f11
+ * key_f12: sent by function key f12
+ * key_f13: sent by function key f13
+ * key_f14: sent by function key f14
+ * key_f15: sent by function key f15
+ * key_f16: sent by function key f16
+ * key_f17: sent by function key f17
+ * key_f18: sent by function key f18
+ * key_f19: sent by function key f19
+ * key_f20: sent by function key f20
+ * key_f21: sent by function key f21
+ * key_f22: sent by function key f22
+ * key_f23: sent by function key f23
+ * key_f24: sent by function key f24
+ * key_f25: sent by function key f25
+ * key_f26: sent by function key f26
+ * key_f27: sent by function key f27
+ * key_f28: sent by function key f28
+ * key_f29: sent by function key f29
+ * key_f30: sent by function key f30
+ * key_f31: sent by function key f31
+ * key_f32: sent by function key f32
+ * key_f33: sent by function key f33
+ * key_f34: sent by function key f34
+ * key_f35: sent by function key f35
+ * key_f36: sent by function key f36
+ * key_f37: sent by function key f37
+ * key_f38: sent by function key f38
+ * key_f39: sent by function key f39
+ * key_f40: sent by function key f40
+ * key_f41: sent by function key f41
+ * key_f42: sent by function key f42
+ * key_f43: sent by function key f43
+ * key_f44: sent by function key f44
+ * key_f45: sent by function key f45
+ * key_f46: sent by function key f46
+ * key_f47: sent by function key f47
+ * key_f48: sent by function key f48
+ * key_f49: sent by function key f49
+ * key_f50: sent by function key f50
+ * key_f51: sent by function key f51
+ * key_f52: sent by function key f52
+ * key_f53: sent by function key f53
+ * key_f54: sent by function key f54
+ * key_f55: sent by function key f55
+ * key_f56: sent by function key f56
+ * key_f57: sent by function key f57
+ * key_f58: sent by function key f58
+ * key_f59: sent by function key f59
+ * key_f60: sent by function key f60
+ * key_f61: sent by function key f61
+ * key_f62: sent by function key f62
+ * key_f63: sent by function key f63
+ * key_find: 0
+ * key_help: sent by help key
+ * key_home: sent by home key
+ * key_ic: sent by ins-char/enter ins-mode key
+ * key_il: sent by insert-line key
+ * key_left: sent by terminal left-arrow key
+ * key_ll: sent by home-down key
+ * key_mark: sent by mark key
+ * key_message: sent by message key
+ * key_mouse: 0631, Mouse event has occured
+ * key_move: sent by move key
+ * key_next: sent by next-object key
+ * key_npage: sent by next-page key
+ * key_open: sent by open key
+ * key_options: sent by options key
+ * key_ppage: sent by previous-page key
+ * key_previous: sent by previous-object key
+ * key_print: sent by print or copy key
+ * key_redo: sent by redo key
+ * key_reference: sent by ref(erence) key
+ * key_refresh: sent by refresh key
+ * key_replace: sent by replace key
+ * key_restart: sent by restart key
+ * key_resume: sent by resume key
+ * key_right: sent by terminal right-arrow key
+ * key_save: sent by save key
+ * key_sbeg: sent by shifted beginning key
+ * key_scancel: sent by shifted cancel key
+ * key_scommand: sent by shifted command key
+ * key_scopy: sent by shifted copy key
+ * key_screate: sent by shifted create key
+ * key_sdc: sent by shifted delete-char key
+ * key_sdl: sent by shifted delete-line key
+ * key_select: sent by select key
+ * key_send: sent by shifted end key
+ * key_seol: sent by shifted clear-line key
+ * key_sexit: sent by shited exit key
+ * key_sf: sent by scroll-forward/down key
+ * key_sfind: sent by shifted find key
+ * key_shelp: sent by shifted help key
+ * key_shome: sent by shifted home key
+ * key_sic: sent by shifted input key
+ * key_sleft: sent by shifted left-arrow key
+ * key_smessage: sent by shifted message key
+ * key_smove: sent by shifted move key
+ * key_snext: sent by shifted next key
+ * key_soptions: sent by shifted options key
+ * key_sprevious: sent by shifted prev key
+ * key_sprint: sent by shifted print key
+ * key_sr: sent by scroll-backwards/up key
+ * key_sredo: sent by shifted redo key
+ * key_sreplace: sent by shifted replace key
+ * key_sright: sent by shifted right-arrow key
+ * key_srsume: sent by shifted resume key
+ * key_ssave: sent by shifted save key
+ * key_ssuspend: sent by shifted suspend key
+ * key_stab: sent by set-tab key
+ * key_sundo: sent by shifted undo key
+ * key_suspend: sent by suspend key
+ * key_undo: sent by undo key
+ * key_up: sent by terminal up-arrow key
+ * keypad_local: Out of "keypad-transmit" mode
+ * keypad_xmit: Put terminal in "keypad-transmit" mode
+ * lab_f0: Labels on function key f0 if not f0
+ * lab_f1: Labels on function key f1 if not f1
+ * lab_f2: Labels on function key f2 if not f2 
+ * lab_f3: Labels on function key f3 if not f3
+ * lab_f4: Labels on function key f4 if not f4
+ * lab_f5: Labels on function key f5 if not f5
+ * lab_f6: Labels on function key f6 if not f6
+ * lab_f7: Labels on function key f7 if not f7
+ * lab_f8: Labels on function key f8 if not f8
+ * lab_f8: Labels on function key f9 if not f9
+ * lab_f10: Labels on function key f10 if not f10
+ * label_format: Label format
+ * label_off: Turn off soft labels
+ * label_on: Turn on soft labels
+ * meta_off: Turn off "meta mode"
+ * meta_on: Turn on "meta mode" (8th bit)
+ * micro_column_address: Like column_address for micro adjustment
+ * micro_down: Like cursor_down for micro adjustment
+ * micro_left: Like cursor_left for micro adjustment
+ * micro_right: Like cursor_right for micro adjustment
+ * micro_row_address: Like row_address for micro adjustment
+ * micro_up: Like cursor_up for micro adjustment
+ * mouse_info: Mouse status information
+ * newline: Newline (behaves like cr followed by lf)
+ * order_of_pins: Matches software bits to print-head pins
+ * orig_colors: Set all colour(-pair)s to original ones
+ * orig_pair: Set default colour-pair to the original one
+ * pad_char: Pad character (rather than NULL)
+ * parm_dch: Delete #1 chars
+ * parm_delete_line: Delete #1 lines
+ * parm_down_cursor: Move down #1 lines
+ * parm_down_micro: Like parm_down_cursor for micro adjustment
+ * parm_ich: Insert #1 blank chars
+ * parm_index: Scroll forward #1 lines
+ * parm_insert_line: Add #1 new blank lines
+ * parm_left_cursor: Move cursor left #1 lines
+ * parm_left_micro: Like parm_left_cursor for micro adjustment
+ * parm_right_cursor: Move right #1 spaces
+ * parm_right_micro: Like parm_right_cursor for micro adjustment
+ * parm_rindex: Scroll backward #1 lines
+ * parm_up_cursor: Move cursor up #1 lines
+ * parm_up_micro: Like parm_up_cursor for micro adjustment
+ * pc_term_options: PC terminal options
+ * pkey_key: Prog funct key #1 to type string #2
+ * pkey_local: Prog funct key #1 to execute string #2
+ * pkey_plab: Prog key #1 to xmit string #2 and show string #3
+ * pkey_xmit: Prog funct key #1 to xmit string #2
+ * pkey_norm: Prog label #1 to show string #3
+ * print_screen: Print contents of screen
+ * ptr_non: Turn off printer for #1 bytes
+ * ptr_off: Turn off the printer
+ * ptr_on: Turn on the printer
+ * pulse: Select pulse dialing
+ * quick_dial: Dial phone number #1, without progress detection
+ * remove_clock: Remove time-of-day clock
+ * repeat_char: Repeat char #1 #2 times
+ * req_for_input: Send next input char (for ptys)
+ * req_mouse_pos: Request mouse position report
+ * reset_1string: Reset terminal completely to sane modes
+ * reset_2string: Reset terminal completely to sane modes
+ * reset_3string: Reset terminal completely to sane modes
+ * reset_file: Name of file containing reset string
+ * restore_cursor: Restore cursor to position of last sc
+ * row_address: Set vertical position to absolute #1
+ * save_cursor: Save cursor position
+ * scancode_escape: Escape for scancode emulation
+ * scroll_forward: Scroll text up
+ * scroll_reverse: Scroll text down
+ * select_char_set: Select character set
+ * set0_des_seq: Shift into codeset 0 (EUC set 0, ASCII)
+ * set1_des_seq: Shift into codeset 1
+ * set2_des_seq: Shift into codeset 2
+ * set3_des_seq: Shift into codeset 3
+ * set_a_attributes: Define second set of video attributes #1-#6
+ * set_a_background: Set background colour to #1 using ANSI escape
+ * set_a_foreground: Set foreground colour to #1 using ANSI escape
+ * set_attributes: Define first set of video attributes #1-#9
+ * set_background: Set background colour to #1
+ * set_bottom_margin: Set bottom margin at current line
+ * set_bottom_margin_parm: Set bottom margin at line #1 or #2 lines from bottom
+ * set_clock: Set clock to hours (#1), minutes (#2), seconds (#3)
+ * set_color_band: Change ribbon to colour #1
+ * set_color_pair: Set current colour pair to #1
+ * set_foreground: Set foreground colour to #1
+ * set_left_margin: Set left margin at current column
+ * set_left_margin_parm: Set left (right) margin at column #1 (#2)
+ * set_lr_margin: Sets both left and right margins
+ * set_page_length: Set page length to #1 lines
+ * set_pglen_inch: Set page length to #1 hundredth of an inch
+ * set_right_margin: Set right margin at current column
+ * set_right_margin_parm: Set right margin at #1
+ * set_tab: Set a tab in all rows, current column
+ * set_tb_margin: Sets both top and bottom margins
+ * set_top_margin: Set top margin at current line
+ * set_top_margin_parm: Set top (bottom) margin at line #1 (#2)
+ * set_window: Current window is lines #1-#2 cols #3-#4
+ * start_bit_image: Start printing bit image graphics
+ * start_char_set_def: Start definition of a character set
+ * stop_bit_image: End printing bit image graphics
+ * stop_char_set_def: End definition of a character set
+ * subscript_characters: List of "subscript-able" characters
+ * superscript_characters: List of "superscript-able" characters
+ * tab: Tab to next 8-space hardware tab stop
+ * these_cause_cr: Printing any of these characters causes cr
+ * to_status_line: Go to status line, col #1
+ * tone: Select tone touch dialing
+ * user0: User string 0
+ * user1: User string 1
+ * user2: User string 2
+ * user3: User string 3
+ * user4: User string 4
+ * user5: User string 5
+ * user6: User string 6
+ * user7: User string 7
+ * user8: User string 8
+ * user9: User string 9
+ * underline_char: Underscore one char and move past it
+ * up_half_line: Half-line up (reverse 1/2 linefeed)
+ * wait_tone: Wait for dial tone
+ * xoff_character: X-off character
+ * xon_character: X-on character
+ * zero_motion: No motion for the subsequent character
+ */
+
 #ifndef _TERMINFO
 typedef struct {
 	int fildes;
@@ -1495,12 +1974,20 @@ int		ti_puts(const TERMINAL *, const cha
     int (*)(int, void *), void *);
 int		ti_putp(const TERMINAL *, const char *);
 
-/* Using tparm can be kunkly, so provide a variadic function */
+/* Using tparm can be kunkly, so provide a variadic function
+ * Numbers have to be passed as int */
 /* This is not standard, but ncurses also provides this */
 char *		tiparm(const char *, ...);
 /* And a thread safe version */
 char *		ti_tiparm(TERMINAL *, const char *, ...);
 
+#ifdef TPARM_TLPARM
+/* Same as the above, but numbers have to be passed as long */
+char *		tlparm(const char *, ...);
+/* And a thread safe version */
+char *		ti_tlparm(TERMINAL *, const char *, ...);
+#endif
+
 /* Default to X/Open tparm, but allow it to be variadic also */
 #ifdef TPARM_VARARGS
 #  define tparm	tiparm

Index: src/lib/libterminfo/term_private.h
diff -u src/lib/libterminfo/term_private.h:1.9.4.1 src/lib/libterminfo/term_private.h:1.9.4.2
--- src/lib/libterminfo/term_private.h:1.9.4.1	Sat Jun 23 22:54:57 2012
+++ src/lib/libterminfo/term_private.h	Thu Mar 14 15:48:29 2013
@@ -1,7 +1,7 @@
-/* $NetBSD: term_private.h,v 1.9.4.1 2012/06/23 22:54:57 riz Exp $ */
+/* $NetBSD: term_private.h,v 1.9.4.2 2013/03/14 15:48:29 riz Exp $ */
 
 /*
- * Copyright (c) 2009, 2010 The NetBSD Foundation, Inc.
+ * Copyright (c) 2009, 2010, 2013 The NetBSD Foundation, Inc.
  *
  * This code is derived from software contributed to The NetBSD Foundation
  * by Roy Marples.
@@ -157,4 +157,7 @@ size_t _ti_store_extra(TIC *, int, char 
 TIC *_ti_compile(char *, int);
 ssize_t _ti_flatten(uint8_t **, const TIC *);
 void _ti_freetic(TIC *);
+
+#define TPARM_MAX 9	/* not likely to change */
+int _ti_parm_analyse(const char *, int *, int);
 #endif

Index: src/lib/libterminfo/terminfo.3
diff -u src/lib/libterminfo/terminfo.3:1.8 src/lib/libterminfo/terminfo.3:1.8.4.1
--- src/lib/libterminfo/terminfo.3:1.8	Tue Oct  4 11:01:14 2011
+++ src/lib/libterminfo/terminfo.3	Thu Mar 14 15:48:28 2013
@@ -1,4 +1,4 @@
-.\"	$NetBSD: terminfo.3,v 1.8 2011/10/04 11:01:14 roy Exp $
+.\"	$NetBSD: terminfo.3,v 1.8.4.1 2013/03/14 15:48:28 riz Exp $
 .\"
 .\" Copyright (c) 2009, 2011 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -27,7 +27,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd October 4, 2011
+.Dd January 25, 2013
 .Dt TERMINFO 3
 .Os
 .Sh NAME
@@ -187,6 +187,12 @@ a
 pointer inside a
 .Vt long
 can use them.
+For platforms which don't support this,
+.Dv NULL
+is returned and
+.Va errno
+is set to
+.Er ENOTSUPP .
 The string encoding and parameter application is described in
 .Xr terminfo 5 .
 .Pp
@@ -213,11 +219,12 @@ always goes to stdout.
 The
 .Fn tiparm
 function allows variadic parameters instead of 9 fixed longs.
-Numeric parameters must be integers (int) instead of longs.
-String parameters can be used even if the platform cannot fit a
+Numeric parameters must be passed as
+.Vt int .
+String parameters must be passed as
 .Vt char *
-into a
-.Vt long .
+and works on all platforms, unlike
+.Fn tparm .
 .Pp
 The
 .Fn ti_*

Index: src/lib/libterminfo/terminfo.5.in
diff -u src/lib/libterminfo/terminfo.5.in:1.15.6.1 src/lib/libterminfo/terminfo.5.in:1.15.6.2
--- src/lib/libterminfo/terminfo.5.in:1.15.6.1	Sat Jun 23 22:54:57 2012
+++ src/lib/libterminfo/terminfo.5.in	Thu Mar 14 15:48:29 2013
@@ -1,6 +1,6 @@
-.\"	$NetBSD: terminfo.5.in,v 1.15.6.1 2012/06/23 22:54:57 riz Exp $
+.\"	$NetBSD: terminfo.5.in,v 1.15.6.2 2013/03/14 15:48:29 riz Exp $
 .\"
-.\" Copyright (c) 2009, 2010, 2011 The NetBSD Foundation, Inc.
+.\" Copyright (c) 2009, 2010, 2011, 2013 The NetBSD Foundation, Inc.
 .\" All rights reserved.
 .\"
 .\" This code is derived from software contributed to The NetBSD Foundation
@@ -27,7 +27,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd June 6, 2012
+.Dd January 25, 2013
 .Dt TERMINFO 5
 .Os
 .Sh NAME
@@ -154,18 +154,18 @@ add 1 to parameters 1 and 2.
 If expr equates to zero then control passes to the optional else part.
 .El
 .Ss Boolean Capabilities
-.Bl -column "enter_near_quality_letter" "setcolor" "TC"
-.It Sy "Long name" Ta Sy "Code" Ta Sy "TC"
+.Bl -column "enter_near_quality_letter" "setcolor" "TC" "desc"
+.It Sy "Long name" Ta Sy "Code" Ta Sy "TC" Ta Sy "Description"
 @BOOLCAPS@
 .El
 .Ss Numeric Capabilities
-.Bl -column "enter_near_quality_letter" "setcolor" "TC"
-.It Sy "Long name" Ta Sy "Code" Ta Sy "TC"
+.Bl -column "enter_near_quality_letter" "setcolor" "TC" "Desc"
+.It Sy "Long name" Ta Sy "Code" Ta Sy "TC" Ta Sy "Description"
 @NUMCAPS@
 .El
 .Ss String Capabilities
-.Bl -column "enter_near_quality_letter" "setcolor" "TC"
-.It Sy "Long name" Ta Sy "Code" Ta Sy "TC"
+.Bl -column "enter_near_quality_letter" "setcolor" "TC" "Desc"
+.It Sy "Long name" Ta Sy "Code" Ta Sy "TC" Ta Sy "Description"
 @STRCAPS@
 .El
 .Ss A Sample Entry

Index: src/lib/libterminfo/tparm.c
diff -u src/lib/libterminfo/tparm.c:1.7.4.2 src/lib/libterminfo/tparm.c:1.7.4.3
--- src/lib/libterminfo/tparm.c:1.7.4.2	Thu Mar 14 15:40:58 2013
+++ src/lib/libterminfo/tparm.c	Thu Mar 14 15:48:29 2013
@@ -1,7 +1,7 @@
-/* $NetBSD: tparm.c,v 1.7.4.2 2013/03/14 15:40:58 riz Exp $ */
+/* $NetBSD: tparm.c,v 1.7.4.3 2013/03/14 15:48:29 riz Exp $ */
 
 /*
- * Copyright (c) 2009, 2011 The NetBSD Foundation, Inc.
+ * Copyright (c) 2009, 2011, 2013 The NetBSD Foundation, Inc.
  *
  * This code is derived from software contributed to The NetBSD Foundation
  * by Roy Marples.
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: tparm.c,v 1.7.4.2 2013/03/14 15:40:58 riz Exp $");
+__RCSID("$NetBSD: tparm.c,v 1.7.4.3 2013/03/14 15:48:29 riz Exp $");
 
 #include <assert.h>
 #include <ctype.h>
@@ -40,21 +40,28 @@ __RCSID("$NetBSD: tparm.c,v 1.7.4.2 2013
 #include <term_private.h>
 #include <term.h>
 
+#define LONG_STR_MAX ((CHAR_BIT * sizeof(long)) / 3)
+#define BUFINC 128	/* Size to increament the terminal buffer by */
+
+#define VA_LONG_LONG	1 
+#define VA_CHAR_INT	2
+//#define VA_CHAR_LONG	3
+
 static TERMINAL *dumbterm; /* For non thread safe functions */
 
 typedef struct {
-	int nums[20];
+	long nums[20];
 	char *strings[20];
 	size_t offset;
 } TPSTACK;
 
 typedef struct {
-	int num;
+	long num;
 	char *string;
 } TPVAR;
 
 static int
-push(int num, char *string, TPSTACK *stack)
+push(long num, char *string, TPSTACK *stack)
 {
 	if (stack->offset >= sizeof(stack->nums)) {
 		errno = E2BIG;
@@ -67,7 +74,7 @@ push(int num, char *string, TPSTACK *sta
 }
 
 static int
-pop(int *num, char **string, TPSTACK *stack)
+pop(long *num, char **string, TPSTACK *stack)
 {
 	if (stack->offset == 0) {
 		if (num)
@@ -114,32 +121,76 @@ ochar(TERMINAL *term, int c)
 }
 
 static size_t
-onum(TERMINAL *term, const char *fmt, int num, int len)
+onum(TERMINAL *term, const char *fmt, int num, unsigned int len)
 {
 	size_t l;
 
-	/* Assume we never have natural number longer than 64 chars */
-	if (len < 64)
-		len = 64;
-	if (checkbuf(term, (size_t)len + 1) == NULL)
+	if (len < LONG_STR_MAX)
+		len = LONG_STR_MAX;
+	if (checkbuf(term, len + 2) == NULL)
 		return 0;
 	l = sprintf(term->_buf + term->_bufpos, fmt, num);
 	term->_bufpos += l;
 	return l;
 }
 
+/*
+  Make a pass through the string so we can work out
+  which parameters are ints and which are char *.
+  Basically we only use char * if %p[1-9] is followed by %l or %s.
+*/
+int
+_ti_parm_analyse(const char *str, int *piss, int piss_len)
+{
+	int nparm, lpop;
+	char c;
+
+	nparm = 0;
+	lpop = -1;
+	while ((c = *str++) != '\0') {
+		if (c != '%')
+			continue;
+		c = *str++;
+		switch (c) {
+			case 'l': /* FALLTHROUGH */
+			case 's':
+				if (lpop > 0) {
+					if (lpop <= piss_len)
+						piss[lpop - 1] = 1;
+					else if (piss)
+						errno = E2BIG;
+				}
+				break;
+			case 'p':
+				c = *str++;
+				if (c < '1' || c > '9') {
+					errno = EINVAL;
+					continue;
+				} else {
+					lpop = c - '0';
+					if (lpop > nparm)
+						nparm = lpop;
+				}
+				break;
+			default:
+				lpop = -1;
+		}
+	}
+
+	return nparm;
+}
+
 static char *
-_ti_tiparm(TERMINAL *term, const char *str, va_list parms)
+_ti_tiparm(TERMINAL *term, const char *str, int va_type, va_list parms)
 {
-	const char *sp;
 	char c, fmt[64], *fp, *ostr;
-	int val, val2;
-	int dnums[26]; /* dynamic variables a-z, not preserved */
+	long val, val2;
+	long dnums[26]; /* dynamic variables a-z, not preserved */
 	size_t l, max;
 	TPSTACK stack;
-	TPVAR params[9];
-	int done, dot, minus, width, precision, olen;
-	int piss[9]; /* Parameter IS String - piss ;) */
+	TPVAR params[TPARM_MAX];
+	unsigned int done, dot, minus, width, precision, olen;
+	int piss[TPARM_MAX]; /* Parameter IS String - piss ;) */
 
 	if (str == NULL)
 		return NULL;
@@ -150,7 +201,6 @@ _ti_tiparm(TERMINAL *term, const char *s
 	  still work with non thread safe functions (which sadly are still the
 	  norm and standard).
 	*/
-
 	if (term == NULL) {
 		if (dumbterm == NULL) {
 			dumbterm = malloc(sizeof(*dumbterm));
@@ -164,57 +214,39 @@ _ti_tiparm(TERMINAL *term, const char *s
 	term->_bufpos = 0;
 	/* Ensure we have an initial buffer */
 	if (term->_buflen == 0) {
-		term->_buf = malloc(BUFSIZ);
+		term->_buf = malloc(BUFINC);
 		if (term->_buf == NULL)
 			return NULL;
-		term->_buflen = BUFSIZ;
+		term->_buflen = BUFINC;
 	}
 
-	/*
-	  Make a first pass through the string so we can work out
-	  which parameters are ints and which are char *.
-	  Basically we only use char * if %p[1-9] is followed by %l or %s.
-	*/
 	memset(&piss, 0, sizeof(piss));
-	max = 0;
-	sp = str;
-	while ((c = *sp++) != '\0') {
-		if (c != '%')
-			continue;
-		c = *sp++;
-		if (c == '\0')
-			break;
-		if (c != 'p')
-			continue;
-		c = *sp++;
-		if (c < '1' || c > '9') {
-			errno = EINVAL;
-			continue;
-		}
-		l = c - '0';
-		if (l > max)
-			max = l;
-		if (*sp != '%')
-			continue;
-		/* Skip formatting */
-		sp++;
-		while (*sp == '.' || *sp == '#' || *sp == ' ' || *sp == ':' ||
-		    *sp == '-' || isdigit((unsigned char)*sp))
-			sp++;
-		if (*sp == 'l' || *sp == 's')
-			piss[l - 1] = 1;
-	}
+	max = _ti_parm_analyse(str, piss, TPARM_MAX);
 
 	/* Put our parameters into variables */
 	memset(&params, 0, sizeof(params));
 	for (l = 0; l < max; l++) {
-		if (piss[l] == 0)
-			params[l].num = va_arg(parms, int);
-		else
-			params[l].string = va_arg(parms, char *);
+		if (piss[l]) {
+			if (va_type == VA_LONG_LONG) {
+				/* This only works if char * fits into a long
+				 * on this platform. */
+				if (sizeof(char *) <= sizeof(long)/*CONSTCOND*/)
+					params[l].string =
+					    (char *)va_arg(parms, long);
+				else {
+					errno = ENOTSUP;
+					return NULL;
+				}
+			} else
+				params[l].string = va_arg(parms, char *);
+		} else {
+			if (va_type == VA_CHAR_INT)
+				params[l].num = (long)va_arg(parms, int);
+			else
+				params[l].num = va_arg(parms, long);
+		}
 	}
 
-	term->_bufpos = 0;
 	memset(&stack, 0, sizeof(stack));
 	while ((c = *str++) != '\0') {
 		if (c != '%' || (c = *str++) == '%') {
@@ -233,11 +265,15 @@ _ti_tiparm(TERMINAL *term, const char *s
 		while (done == 0 && (size_t)(fp - fmt) < sizeof(fmt)) {
 			switch (c) {
 			case 'c': /* FALLTHROUGH */
+			case 's':
+				*fp++ = c;
+				done = 1;
+				break;
 			case 'd': /* FALLTHROUGH */
 			case 'o': /* FALLTHROUGH */
 			case 'x': /* FALLTHROUGH */
 			case 'X': /* FALLTHROUGH */
-			case 's':
+				*fp++ = 'l';
 				*fp++ = c;
 				done = 1;
 				break;
@@ -286,7 +322,7 @@ _ti_tiparm(TERMINAL *term, const char *s
 				width = val;
 			else
 				precision = val;
-			olen = (width > precision) ? width : precision;
+			olen = MAX(width, precision);
 		}
 		*fp++ = '\0';
 
@@ -316,15 +352,19 @@ _ti_tiparm(TERMINAL *term, const char *s
 				l = 0;
 			else
 				l = strlen(ostr);
-			if (onum(term, "%d", (int)l, 0) == 0)
+#ifdef NCURSES_COMPAT_57
+			if (onum(term, "%ld", (long)l, 0) == 0)
 				return NULL;
+#else
+			push((long)l, NULL, &stack);
+#endif
 			break;
 		case 'd': /* FALLTHROUGH */
 		case 'o': /* FALLTHROUGH */
 		case 'x': /* FALLTHROUGH */
 		case 'X':
 			pop(&val, NULL, &stack);
-			if (onum(term, fmt, val, olen) == 0)
+			if (onum(term, fmt, (int)val, olen) == 0)
 				return NULL;
 			break;
 		case 'p':
@@ -358,7 +398,7 @@ _ti_tiparm(TERMINAL *term, const char *s
 				params[1].num++;
 			break;
 		case '\'':
-			if (push((int)(unsigned char)*str++, NULL, &stack))
+			if (push((long)(unsigned char)*str++, NULL, &stack))
 				return NULL;
 			while (*str != '\0' && *str != '\'')
 				str++;
@@ -438,7 +478,7 @@ _ti_tiparm(TERMINAL *term, const char *s
 		case '!':
 		case '~':
 			pop(&val, NULL, &stack);
-			switch (*str) {
+			switch (c) {
 			case '!':
 				val = !val;
 				break;
@@ -511,7 +551,7 @@ ti_tiparm(TERMINAL *term, const char *st
 	_DIAGASSERT(str != NULL);
 
 	va_start(va, str);
-	ret = _ti_tiparm(term, str, va);
+	ret = _ti_tiparm(term, str, VA_CHAR_INT, va);
 	va_end(va);
 	return ret;
 }
@@ -525,18 +565,61 @@ tiparm(const char *str, ...)
 	_DIAGASSERT(str != NULL);
 
 	va_start(va, str);
-        ret = _ti_tiparm(NULL, str, va);
+	ret = _ti_tiparm(NULL, str, VA_CHAR_INT, va);
+	va_end(va);
+	return ret;
+}
+
+#ifdef VA_CHAR_LONG
+char *
+ti_tlparm(TERMINAL *term, const char *str, ...)
+{
+	va_list va;
+	char *ret;
+
+	_DIAGASSERT(term != NULL);
+	_DIAGASSERT(str != NULL);
+
+	va_start(va, str);
+	ret = _ti_tiparm(term, str, VA_CHAR_LONG, va);
+	va_end(va);
+	return ret;
+}
+
+char *
+tlparm(const char *str, ...)
+{
+	va_list va;
+	char *ret;
+	
+	_DIAGASSERT(str != NULL);
+
+	va_start(va, str);
+	ret = _ti_tiparm(NULL, str, VA_CHAR_LONG, va);
+	va_end(va);
+	return ret;
+}
+#endif
+
+static char *
+_tparm(const char *str, ...)
+{
+	va_list va;
+	char *ret;
+	
+	_DIAGASSERT(str != NULL);
+
+	va_start(va, str);
+	ret = _ti_tiparm(NULL, str, VA_LONG_LONG, va);
 	va_end(va);
 	return ret;
 }
 
 char *
 tparm(const char *str,
-    long lp1, long lp2, long lp3, long lp4, long lp5,
-    long lp6, long lp7, long lp8, long lp9)
+    long p1, long p2, long p3, long p4, long p5,
+    long p6, long p7, long p8, long p9)
 {
-	int p1 = lp1, p2 = lp2, p3 = lp3, p4 = lp4, p5 = lp5;
-	int p6 = lp6, p7 = lp7, p8 = lp8, p9 = lp9;
 
-	return tiparm(str, p1, p2, p3, p4, p5, p6, p7, p8, p9);
+	return _tparm(str, p1, p2, p3, p4, p5, p6, p7, p8, p9);
 }

Index: src/usr.bin/tput/Makefile
diff -u src/usr.bin/tput/Makefile:1.10 src/usr.bin/tput/Makefile:1.10.8.1
--- src/usr.bin/tput/Makefile:1.10	Wed Feb  3 15:34:46 2010
+++ src/usr.bin/tput/Makefile	Thu Mar 14 15:48:29 2013
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.10 2010/02/03 15:34:46 roy Exp $
+#	$NetBSD: Makefile,v 1.10.8.1 2013/03/14 15:48:29 riz Exp $
 #	@(#)Makefile	8.1 (Berkeley) 6/6/93
 
 PROG=	tput
@@ -7,4 +7,6 @@ LDADD=	-lterminfo
 MLINKS=	tput.1 clear.1
 SCRIPTS=clear.sh
 
+CPPFLAGS+=	-I${.CURDIR}/../../lib/libterminfo
+
 .include <bsd.prog.mk>

Index: src/usr.bin/tput/tput.c
diff -u src/usr.bin/tput/tput.c:1.22 src/usr.bin/tput/tput.c:1.22.4.1
--- src/usr.bin/tput/tput.c:1.22	Tue Oct  4 12:23:14 2011
+++ src/usr.bin/tput/tput.c	Thu Mar 14 15:48:29 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: tput.c,v 1.22 2011/10/04 12:23:14 roy Exp $	*/
+/*	$NetBSD: tput.c,v 1.22.4.1 2013/03/14 15:48:29 riz Exp $	*/
 
 /*-
  * Copyright (c) 1980, 1988, 1993
@@ -39,20 +39,21 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 19
 #if 0
 static char sccsid[] = "@(#)tput.c	8.3 (Berkeley) 4/28/95";
 #endif
-__RCSID("$NetBSD: tput.c,v 1.22 2011/10/04 12:23:14 roy Exp $");
+__RCSID("$NetBSD: tput.c,v 1.22.4.1 2013/03/14 15:48:29 riz Exp $");
 #endif /* not lint */
 
 #include <termios.h>
 
 #include <err.h>
+#include <errno.h>
+#include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <term_private.h>
 #include <term.h>
-#include <termcap.h>
 #include <unistd.h>
 
-static int    outc(int);
 static void   usage(void) __dead;
 static char **process(const char *, const char *, char **);
 
@@ -91,7 +92,7 @@ main(int argc, char **argv)
 			if (!strcmp(p, "init")) {
 				s = tigetstr("is1");
 				if (s != NULL)
-					tputs(s, 0, outc);
+					putp(s);
 				p = "is2";
 			}
 			break;
@@ -105,7 +106,7 @@ main(int argc, char **argv)
 			if (!strcmp(p, "reset")) {
 				s = tigetstr("rs1");
 				if (s != NULL)
-					tputs(s, 0, outc);
+					putp(s);
 				p = "rs2";
 			}
 			break;
@@ -140,93 +141,50 @@ process(const char *cap, const char *str
 	static const char errfew[] =
 	    "Not enough arguments (%d) for capability `%s'";
 	static const char erresc[] =
-	    "Unknown %% escape `%c' for capability `%s'";
-	char c, l;
-	const char *p;
-	int arg_need, p1, p2, p3, p4, p5, p6, p7, p8, p9;
+	    "Unknown %% escape (%s) for capability `%s'";
+	static const char errnum[] =
+	    "Expected a numeric argument [%d] (%s) for capability `%s'";
+	static const char errcharlong[] = 
+	    "Platform does not fit a string into a long for capability '%s'";
+	int i, nparams, piss[TPARM_MAX];
+	long nums[TPARM_MAX];
+	char *strs[TPARM_MAX], *tmp;
 
 	/* Count how many values we need for this capability. */
-	arg_need = 0;
-	p = str;
-	while ((c = *p++) != '\0') {
-		if (c != '%')
-			continue;
-		c = *p++;
-		if (c == '\0')
-			break;
-		if (c != 'p')
-			continue;
-		c = *p++;
-		if (c < '1' || c > '9')
-			errx(2, erresc, c, cap);
-		l = c - '0';
-		if (l > arg_need)
-			arg_need = l;
-	}
-	
-#define NEXT_ARG							      \
-	{								      \
-		if (*++argv == NULL || *argv[0] == '\0')		      \
-			errx(2, errfew, 1, cap);			      \
+	errno = 0;
+	memset(&piss, 0, sizeof(piss));
+	nparams = _ti_parm_analyse(str, piss, TPARM_MAX);
+	if (errno == EINVAL)
+		errx(2, erresc, str, cap);
+
+	/* Create our arrays of integers and strings */
+	for (i = 0; i < nparams; i++) {
+		if (*++argv == NULL || *argv[0] == '\0')
+			errx(2, errfew, nparams, cap);
+		if (piss[i]) {
+			if (sizeof(char *) > sizeof(long) /* CONSTCOND */)
+				errx(2, errcharlong, cap);
+			strs[i] = *argv;
+		} else {
+			errno = 0;
+			nums[i] = strtol(*argv, &tmp, 0);
+			if ((errno == ERANGE && 
+			    (nums[i] == LONG_MIN || nums[i] == LONG_MAX)) ||
+			    (errno != 0 && nums[i] == 0) ||
+			    tmp == str ||
+			    *tmp != '\0')
+				errx(2, errnum, i + 1, *argv, cap);
+		}
 	}
 
-	if (arg_need > 0) {
-		NEXT_ARG;
-		p1 = atoi(*argv);
-	} else
-		p1 = 0;
-	if (arg_need > 1) {
-		NEXT_ARG;
-		p2 = atoi(*argv);
-	} else
-		p2 = 0;
-	if (arg_need > 2) {
-		NEXT_ARG;
-		p3 = atoi(*argv);
-	} else
-		p3 = 0;
-	if (arg_need > 3) {
-		NEXT_ARG;
-		p4 = atoi(*argv);
-	} else
-		p4 = 0;
-	if (arg_need > 4) {
-		NEXT_ARG;
-		p5 = atoi(*argv);
-	} else
-		p5 = 0;
-	if (arg_need > 5) {
-		NEXT_ARG;
-		p6 = atoi(*argv);
-	} else
-		p6 = 0;
-	if (arg_need > 6) {
-		NEXT_ARG;
-		p7 = atoi(*argv);
-	} else
-		p7 = 0;
-	if (arg_need > 7) {
-		NEXT_ARG;
-		p8 = atoi(*argv);
-	} else
-		p8 = 0;
-	if (arg_need > 8) {
-		NEXT_ARG;
-		p9 = atoi(*argv);
-	} else
-		p9 = 0;
+	/* And output */
+#define p(i)	(i <= nparams ? \
+		    (piss[i - 1] ? (long)strs[i - 1] : nums[i - 1]) : 0)
+	putp(tparm(str, p(1), p(2), p(3), p(4), p(5), p(6), p(7), p(8), p(9)));
 
-	/* And print them. */
-	(void)tputs(tparm(str, p1, p2, p3, p4, p5, p6, p7, p8, p9), 0, outc);
 	return argv;
 }
 
-static int
-outc(int c)
-{
-	return putchar(c);
-}
-
 static void
 usage(void)
 {

Reply via email to