1*86d7f5d3SJohn Marino /*
2*86d7f5d3SJohn Marino  * Copyright (c)2004 Cat's Eye Technologies.  All rights reserved.
3*86d7f5d3SJohn Marino  *
4*86d7f5d3SJohn Marino  * Redistribution and use in source and binary forms, with or without
5*86d7f5d3SJohn Marino  * modification, are permitted provided that the following conditions
6*86d7f5d3SJohn Marino  * are met:
7*86d7f5d3SJohn Marino  *
8*86d7f5d3SJohn Marino  *   Redistributions of source code must retain the above copyright
9*86d7f5d3SJohn Marino  *   notice, this list of conditions and the following disclaimer.
10*86d7f5d3SJohn Marino  *
11*86d7f5d3SJohn Marino  *   Redistributions in binary form must reproduce the above copyright
12*86d7f5d3SJohn Marino  *   notice, this list of conditions and the following disclaimer in
13*86d7f5d3SJohn Marino  *   the documentation and/or other materials provided with the
14*86d7f5d3SJohn Marino  *   distribution.
15*86d7f5d3SJohn Marino  *
16*86d7f5d3SJohn Marino  *   Neither the name of Cat's Eye Technologies nor the names of its
17*86d7f5d3SJohn Marino  *   contributors may be used to endorse or promote products derived
18*86d7f5d3SJohn Marino  *   from this software without specific prior written permission.
19*86d7f5d3SJohn Marino  *
20*86d7f5d3SJohn Marino  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*86d7f5d3SJohn Marino  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*86d7f5d3SJohn Marino  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23*86d7f5d3SJohn Marino  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24*86d7f5d3SJohn Marino  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
25*86d7f5d3SJohn Marino  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26*86d7f5d3SJohn Marino  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27*86d7f5d3SJohn Marino  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28*86d7f5d3SJohn Marino  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29*86d7f5d3SJohn Marino  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30*86d7f5d3SJohn Marino  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
31*86d7f5d3SJohn Marino  * OF THE POSSIBILITY OF SUCH DAMAGE.
32*86d7f5d3SJohn Marino  */
33*86d7f5d3SJohn Marino 
34*86d7f5d3SJohn Marino /*
35*86d7f5d3SJohn Marino  * curses_util.c
36*86d7f5d3SJohn Marino  * $Id: curses_util.c,v 1.7 2005/02/08 07:49:03 cpressey Exp $
37*86d7f5d3SJohn Marino  */
38*86d7f5d3SJohn Marino 
39*86d7f5d3SJohn Marino #include <ctype.h>
40*86d7f5d3SJohn Marino #include <ncurses.h>
41*86d7f5d3SJohn Marino #include <panel.h>
42*86d7f5d3SJohn Marino #include <stdio.h>
43*86d7f5d3SJohn Marino #include <stdlib.h>
44*86d7f5d3SJohn Marino #include <string.h>
45*86d7f5d3SJohn Marino 
46*86d7f5d3SJohn Marino #include "curses_util.h"
47*86d7f5d3SJohn Marino 
48*86d7f5d3SJohn Marino unsigned int ymax, xmax;
49*86d7f5d3SJohn Marino int monochrome = 1;
50*86d7f5d3SJohn Marino int allocated_colors = 0;
51*86d7f5d3SJohn Marino 
52*86d7f5d3SJohn Marino struct curses_attr {
53*86d7f5d3SJohn Marino 	int pair_no;
54*86d7f5d3SJohn Marino 	int bold;
55*86d7f5d3SJohn Marino };
56*86d7f5d3SJohn Marino 
57*86d7f5d3SJohn Marino struct curses_attr colors_tab[CURSES_COLORS_MAX];
58*86d7f5d3SJohn Marino 
59*86d7f5d3SJohn Marino int colors[8] = {
60*86d7f5d3SJohn Marino 	COLOR_BLACK,
61*86d7f5d3SJohn Marino 	COLOR_RED,
62*86d7f5d3SJohn Marino 	COLOR_GREEN,
63*86d7f5d3SJohn Marino 	COLOR_YELLOW,
64*86d7f5d3SJohn Marino 	COLOR_BLUE,
65*86d7f5d3SJohn Marino 	COLOR_MAGENTA,
66*86d7f5d3SJohn Marino 	COLOR_CYAN,
67*86d7f5d3SJohn Marino 	COLOR_WHITE
68*86d7f5d3SJohn Marino };
69*86d7f5d3SJohn Marino 
70*86d7f5d3SJohn Marino /*
71*86d7f5d3SJohn Marino  * If there is an established color pair with the given fg and bg
72*86d7f5d3SJohn Marino  * colors, return it.  Else allocate a new pair with these colors
73*86d7f5d3SJohn Marino  * and return that.
74*86d7f5d3SJohn Marino  */
75*86d7f5d3SJohn Marino static int
curses_colors_find(int fg,int bg)76*86d7f5d3SJohn Marino curses_colors_find(int fg, int bg)
77*86d7f5d3SJohn Marino {
78*86d7f5d3SJohn Marino 	int pair_no;
79*86d7f5d3SJohn Marino 	short fge, bge;
80*86d7f5d3SJohn Marino 
81*86d7f5d3SJohn Marino 	for (pair_no = 0;
82*86d7f5d3SJohn Marino 	     pair_no <= allocated_colors && pair_no < COLOR_PAIRS;
83*86d7f5d3SJohn Marino 	     pair_no++) {
84*86d7f5d3SJohn Marino 		pair_content(pair_no, &fge, &bge);
85*86d7f5d3SJohn Marino 		if (fg == fge && bg == bge)
86*86d7f5d3SJohn Marino 			return(pair_no);
87*86d7f5d3SJohn Marino 	}
88*86d7f5d3SJohn Marino 
89*86d7f5d3SJohn Marino 	/*
90*86d7f5d3SJohn Marino 	 * No pair was found, allocate a new one.
91*86d7f5d3SJohn Marino 	 */
92*86d7f5d3SJohn Marino 	if (allocated_colors < (COLOR_PAIRS-1)) {
93*86d7f5d3SJohn Marino 		allocated_colors++;
94*86d7f5d3SJohn Marino 		init_pair(allocated_colors, fg, bg);
95*86d7f5d3SJohn Marino 		return(allocated_colors);
96*86d7f5d3SJohn Marino 	}
97*86d7f5d3SJohn Marino 
98*86d7f5d3SJohn Marino 	/*
99*86d7f5d3SJohn Marino 	 * No space to allocate a new one, return error.
100*86d7f5d3SJohn Marino 	 */
101*86d7f5d3SJohn Marino 	return(-1);
102*86d7f5d3SJohn Marino }
103*86d7f5d3SJohn Marino 
104*86d7f5d3SJohn Marino static void
curses_colors_cfg(int role,int fg,int bg,int bold)105*86d7f5d3SJohn Marino curses_colors_cfg(int role, int fg, int bg, int bold)
106*86d7f5d3SJohn Marino {
107*86d7f5d3SJohn Marino 	int pair_no;
108*86d7f5d3SJohn Marino 
109*86d7f5d3SJohn Marino 	pair_no = curses_colors_find(fg, bg);
110*86d7f5d3SJohn Marino 	if (pair_no != -1) {
111*86d7f5d3SJohn Marino 		colors_tab[role].pair_no = pair_no;
112*86d7f5d3SJohn Marino 		colors_tab[role].bold = bold;
113*86d7f5d3SJohn Marino 	} else {
114*86d7f5d3SJohn Marino 		colors_tab[role].pair_no = 0;
115*86d7f5d3SJohn Marino 		colors_tab[role].bold = bold;
116*86d7f5d3SJohn Marino 	}
117*86d7f5d3SJohn Marino }
118*86d7f5d3SJohn Marino 
119*86d7f5d3SJohn Marino void
curses_colors_init(int force_monochrome)120*86d7f5d3SJohn Marino curses_colors_init(int force_monochrome)
121*86d7f5d3SJohn Marino {
122*86d7f5d3SJohn Marino 	if (!force_monochrome) {
123*86d7f5d3SJohn Marino 		if (has_colors()) {
124*86d7f5d3SJohn Marino 			monochrome = 0;
125*86d7f5d3SJohn Marino 			start_color();
126*86d7f5d3SJohn Marino 		}
127*86d7f5d3SJohn Marino 	}
128*86d7f5d3SJohn Marino 
129*86d7f5d3SJohn Marino 	/*
130*86d7f5d3SJohn Marino 	 * By default, make it look kinda like the default libdialog.
131*86d7f5d3SJohn Marino 	 */
132*86d7f5d3SJohn Marino 	curses_colors_cfg(CURSES_COLORS_NORMAL,    COLOR_BLACK,  COLOR_GREY,  0);
133*86d7f5d3SJohn Marino 	curses_colors_cfg(CURSES_COLORS_BACKDROP,  COLOR_WHITE,  COLOR_BLUE,  0);
134*86d7f5d3SJohn Marino 	curses_colors_cfg(CURSES_COLORS_MENUBAR,   COLOR_BLACK,  COLOR_GREY,  0);
135*86d7f5d3SJohn Marino 	curses_colors_cfg(CURSES_COLORS_STATUSBAR, COLOR_BLACK,  COLOR_GREY,  0);
136*86d7f5d3SJohn Marino 	curses_colors_cfg(CURSES_COLORS_BORDER,	   COLOR_WHITE,  COLOR_GREY,  1);
137*86d7f5d3SJohn Marino 	curses_colors_cfg(CURSES_COLORS_FORMTITLE, COLOR_YELLOW, COLOR_GREY,  1);
138*86d7f5d3SJohn Marino 	curses_colors_cfg(CURSES_COLORS_LABEL,     COLOR_BLACK,  COLOR_GREY,  0);
139*86d7f5d3SJohn Marino 	curses_colors_cfg(CURSES_COLORS_CONTROL,   COLOR_BLACK,  COLOR_GREY,  0);
140*86d7f5d3SJohn Marino 	curses_colors_cfg(CURSES_COLORS_TEXT,      COLOR_BLACK,  COLOR_GREY,  0);
141*86d7f5d3SJohn Marino 	curses_colors_cfg(CURSES_COLORS_FOCUS,     COLOR_WHITE,  COLOR_BLUE,  1);
142*86d7f5d3SJohn Marino 	curses_colors_cfg(CURSES_COLORS_SCROLLAREA,COLOR_GREY,   COLOR_BLACK, 0);
143*86d7f5d3SJohn Marino 	curses_colors_cfg(CURSES_COLORS_SCROLLBAR, COLOR_WHITE,  COLOR_BLUE,  1);
144*86d7f5d3SJohn Marino 	curses_colors_cfg(CURSES_COLORS_ACCEL,     COLOR_WHITE,  COLOR_GREY,  1);
145*86d7f5d3SJohn Marino 	curses_colors_cfg(CURSES_COLORS_ACCELFOCUS,COLOR_YELLOW, COLOR_BLUE,  1);
146*86d7f5d3SJohn Marino }
147*86d7f5d3SJohn Marino 
148*86d7f5d3SJohn Marino void
curses_colors_set(WINDOW * w,int a)149*86d7f5d3SJohn Marino curses_colors_set(WINDOW *w, int a)
150*86d7f5d3SJohn Marino {
151*86d7f5d3SJohn Marino 	if (!monochrome)
152*86d7f5d3SJohn Marino 		wattrset(w, COLOR_PAIR(colors_tab[a].pair_no));
153*86d7f5d3SJohn Marino 	if (colors_tab[a].bold)
154*86d7f5d3SJohn Marino 		wattron(w, A_BOLD);
155*86d7f5d3SJohn Marino 	else
156*86d7f5d3SJohn Marino 		wattroff(w, A_BOLD);
157*86d7f5d3SJohn Marino }
158*86d7f5d3SJohn Marino 
159*86d7f5d3SJohn Marino void
curses_window_blank(WINDOW * w)160*86d7f5d3SJohn Marino curses_window_blank(WINDOW *w)
161*86d7f5d3SJohn Marino {
162*86d7f5d3SJohn Marino 	unsigned int i;
163*86d7f5d3SJohn Marino 
164*86d7f5d3SJohn Marino 	for (i = 0; i <= ymax; i++) {
165*86d7f5d3SJohn Marino 		wmove(w, i, 0);
166*86d7f5d3SJohn Marino 		whline(w, ' ', xmax);
167*86d7f5d3SJohn Marino 	}
168*86d7f5d3SJohn Marino 
169*86d7f5d3SJohn Marino 	wrefresh(w);
170*86d7f5d3SJohn Marino }
171*86d7f5d3SJohn Marino 
172*86d7f5d3SJohn Marino void
curses_frame_draw(int x,int y,int width,int height)173*86d7f5d3SJohn Marino curses_frame_draw(int x, int y, int width, int height)
174*86d7f5d3SJohn Marino {
175*86d7f5d3SJohn Marino 	int i;
176*86d7f5d3SJohn Marino 
177*86d7f5d3SJohn Marino 	mvaddch(y, x, ACS_ULCORNER);
178*86d7f5d3SJohn Marino 	hline(ACS_HLINE, width - 2);
179*86d7f5d3SJohn Marino 	mvaddch(y, x + width - 1, ACS_URCORNER);
180*86d7f5d3SJohn Marino 
181*86d7f5d3SJohn Marino 	mvaddch(y + height - 1, x, ACS_LLCORNER);
182*86d7f5d3SJohn Marino 	hline(ACS_HLINE, width - 2);
183*86d7f5d3SJohn Marino 	mvaddch(y + height - 1, x + width - 1, ACS_LRCORNER);
184*86d7f5d3SJohn Marino 
185*86d7f5d3SJohn Marino 	move(y + 1, x);
186*86d7f5d3SJohn Marino 	vline(ACS_VLINE, height - 2);
187*86d7f5d3SJohn Marino 
188*86d7f5d3SJohn Marino 	move(y + 1, x + width - 1);
189*86d7f5d3SJohn Marino 	vline(ACS_VLINE, height - 2);
190*86d7f5d3SJohn Marino 
191*86d7f5d3SJohn Marino 	for (i = y + 1; i < y + height - 1; i++) {
192*86d7f5d3SJohn Marino 		move(i, x + 1);
193*86d7f5d3SJohn Marino 		hline(' ', width - 2);
194*86d7f5d3SJohn Marino 	}
195*86d7f5d3SJohn Marino }
196*86d7f5d3SJohn Marino 
197*86d7f5d3SJohn Marino void
curses_load_backdrop(WINDOW * w,const char * filename)198*86d7f5d3SJohn Marino curses_load_backdrop(WINDOW *w, const char *filename)
199*86d7f5d3SJohn Marino {
200*86d7f5d3SJohn Marino 	FILE *f;
201*86d7f5d3SJohn Marino 	char line[80];
202*86d7f5d3SJohn Marino 	int row = 1;
203*86d7f5d3SJohn Marino 	int my, mx;
204*86d7f5d3SJohn Marino 
205*86d7f5d3SJohn Marino 	getmaxyx(w, my, mx);
206*86d7f5d3SJohn Marino 	wclear(w);
207*86d7f5d3SJohn Marino 	curses_colors_set(w, CURSES_COLORS_BACKDROP);
208*86d7f5d3SJohn Marino 	curses_window_blank(w);
209*86d7f5d3SJohn Marino 
210*86d7f5d3SJohn Marino 	if ((f = fopen(filename, "r")) != NULL) {
211*86d7f5d3SJohn Marino 		while (fgets(line, 79, f) != NULL) {
212*86d7f5d3SJohn Marino 			if (row > my)
213*86d7f5d3SJohn Marino 				break;
214*86d7f5d3SJohn Marino 			if (line[strlen(line) - 1] == '\n')
215*86d7f5d3SJohn Marino 				line[strlen(line) - 1] = '\0';
216*86d7f5d3SJohn Marino 			mvwaddnstr(w, row++, 0, line, mx);
217*86d7f5d3SJohn Marino 		}
218*86d7f5d3SJohn Marino 		fclose(f);
219*86d7f5d3SJohn Marino 	}
220*86d7f5d3SJohn Marino }
221*86d7f5d3SJohn Marino 
222*86d7f5d3SJohn Marino void
curses_debug_str(const char * s)223*86d7f5d3SJohn Marino curses_debug_str(const char *s)
224*86d7f5d3SJohn Marino {
225*86d7f5d3SJohn Marino 	char b[256];
226*86d7f5d3SJohn Marino 
227*86d7f5d3SJohn Marino 	move(1, 0);
228*86d7f5d3SJohn Marino 	sprintf(b, "[%77s]", s);
229*86d7f5d3SJohn Marino 	addstr(b);
230*86d7f5d3SJohn Marino 	refresh();
231*86d7f5d3SJohn Marino }
232*86d7f5d3SJohn Marino 
233*86d7f5d3SJohn Marino void
curses_debug_int(int i)234*86d7f5d3SJohn Marino curses_debug_int(int i)
235*86d7f5d3SJohn Marino {
236*86d7f5d3SJohn Marino 	char b[256];
237*86d7f5d3SJohn Marino 
238*86d7f5d3SJohn Marino 	move(1, 0);
239*86d7f5d3SJohn Marino 	sprintf(b, "[%06d]", i);
240*86d7f5d3SJohn Marino 	addstr(b);
241*86d7f5d3SJohn Marino 	refresh();
242*86d7f5d3SJohn Marino }
243*86d7f5d3SJohn Marino 
244*86d7f5d3SJohn Marino void
curses_debug_key(int i)245*86d7f5d3SJohn Marino curses_debug_key(int i)
246*86d7f5d3SJohn Marino {
247*86d7f5d3SJohn Marino 	char b[256];
248*86d7f5d3SJohn Marino 
249*86d7f5d3SJohn Marino 	move(1, 0);
250*86d7f5d3SJohn Marino 	sprintf(b, "[%06d] %s", i, keyname(i));
251*86d7f5d3SJohn Marino 	addstr(b);
252*86d7f5d3SJohn Marino 	refresh();
253*86d7f5d3SJohn Marino }
254*86d7f5d3SJohn Marino 
255*86d7f5d3SJohn Marino void
curses_debug_float(float f)256*86d7f5d3SJohn Marino curses_debug_float(float f)
257*86d7f5d3SJohn Marino {
258*86d7f5d3SJohn Marino 	char b[256];
259*86d7f5d3SJohn Marino 
260*86d7f5d3SJohn Marino 	move(1, 0);
261*86d7f5d3SJohn Marino 	sprintf(b, "[%09.3f]", f);
262*86d7f5d3SJohn Marino 	addstr(b);
263*86d7f5d3SJohn Marino 	refresh();
264*86d7f5d3SJohn Marino }
265*86d7f5d3SJohn Marino 
266*86d7f5d3SJohn Marino /*
267*86d7f5d3SJohn Marino  * Word wrapping.
268*86d7f5d3SJohn Marino  *
269*86d7f5d3SJohn Marino  * text:	The text to word-wrap, as one long string.  Spaces will be
270*86d7f5d3SJohn Marino  *		compressed, but end-of-line characters will be honoured.
271*86d7f5d3SJohn Marino  * line:	A buffer (must be allocated by the caller) to hold a single
272*86d7f5d3SJohn Marino  *		line extracted from text.
273*86d7f5d3SJohn Marino  * width:	The maximum width of a line.
274*86d7f5d3SJohn Marino  * spos:	Pointer to the source position in text.  Should be initially
275*86d7f5d3SJohn Marino  *		set to zero, and retained between calls to this function.
276*86d7f5d3SJohn Marino  * Returns:	A boolean indicating whether the end of text was reached.
277*86d7f5d3SJohn Marino  *		Typically this function should be called repeatedly until
278*86d7f5d3SJohn Marino  *		it returns true.
279*86d7f5d3SJohn Marino  */
280*86d7f5d3SJohn Marino int
extract_wrapped_line(const char * text,char * line,int width,int * spos)281*86d7f5d3SJohn Marino extract_wrapped_line(const char *text, char *line, int width, int *spos)
282*86d7f5d3SJohn Marino {
283*86d7f5d3SJohn Marino 	int dpos = 0;
284*86d7f5d3SJohn Marino 	int saved_spos, saved_dpos;
285*86d7f5d3SJohn Marino 
286*86d7f5d3SJohn Marino 	for (;;) {
287*86d7f5d3SJohn Marino 		/*
288*86d7f5d3SJohn Marino 		 * Skip over whitespace.  If we find a newline or the
289*86d7f5d3SJohn Marino 		 * end of the text, return a blank line.  Leave *spos
290*86d7f5d3SJohn Marino 		 * at the position of the 1st non-whitespace character.
291*86d7f5d3SJohn Marino 		 */
292*86d7f5d3SJohn Marino 		while (isspace(text[*spos]) && text[*spos] != '\0') {
293*86d7f5d3SJohn Marino 			if (text[*spos] == '\n') {
294*86d7f5d3SJohn Marino 				line[dpos] = '\0';
295*86d7f5d3SJohn Marino 				(*spos)++;
296*86d7f5d3SJohn Marino 				return(0);
297*86d7f5d3SJohn Marino 			}
298*86d7f5d3SJohn Marino 			(*spos)++;
299*86d7f5d3SJohn Marino 		}
300*86d7f5d3SJohn Marino 
301*86d7f5d3SJohn Marino 		/*
302*86d7f5d3SJohn Marino 		 * Save start position and destination position.
303*86d7f5d3SJohn Marino 		 */
304*86d7f5d3SJohn Marino 		saved_spos = *spos;
305*86d7f5d3SJohn Marino 		saved_dpos = dpos;
306*86d7f5d3SJohn Marino 
307*86d7f5d3SJohn Marino 		/*
308*86d7f5d3SJohn Marino 		 * Read a word from *spos onward.
309*86d7f5d3SJohn Marino 		 */
310*86d7f5d3SJohn Marino 		while (!isspace(text[*spos]) &&
311*86d7f5d3SJohn Marino 		       text[*spos] != '\0' &&
312*86d7f5d3SJohn Marino 		       dpos < width) {
313*86d7f5d3SJohn Marino 			line[dpos++] = text[(*spos)++];
314*86d7f5d3SJohn Marino 		}
315*86d7f5d3SJohn Marino 
316*86d7f5d3SJohn Marino 		if (text[*spos] == '\0') {
317*86d7f5d3SJohn Marino 			/*
318*86d7f5d3SJohn Marino 			 * End of string - return this word as the last.
319*86d7f5d3SJohn Marino 			 */
320*86d7f5d3SJohn Marino 			line[dpos] = '\0';
321*86d7f5d3SJohn Marino 			return(1);
322*86d7f5d3SJohn Marino 		} else if (dpos >= width) {
323*86d7f5d3SJohn Marino 			/*
324*86d7f5d3SJohn Marino 			 * Last word is too long to fit on this line.
325*86d7f5d3SJohn Marino 			 */
326*86d7f5d3SJohn Marino 			if (dpos - saved_dpos >= width) {
327*86d7f5d3SJohn Marino 				/*
328*86d7f5d3SJohn Marino 				 * In fact, it's too long to fit on any line!
329*86d7f5d3SJohn Marino 				 * Truncate it.
330*86d7f5d3SJohn Marino 				 */
331*86d7f5d3SJohn Marino 				line[width - 1] = '\0';
332*86d7f5d3SJohn Marino 				*spos = saved_spos + (dpos - saved_dpos);
333*86d7f5d3SJohn Marino 				return(0);
334*86d7f5d3SJohn Marino 			} else {
335*86d7f5d3SJohn Marino 				/*
336*86d7f5d3SJohn Marino 				 * Save it for the next pass.
337*86d7f5d3SJohn Marino 				 */
338*86d7f5d3SJohn Marino 				*spos = saved_spos;
339*86d7f5d3SJohn Marino 				line[saved_dpos - 1] = '\0';
340*86d7f5d3SJohn Marino 				return(0);
341*86d7f5d3SJohn Marino 			}
342*86d7f5d3SJohn Marino 		} else {
343*86d7f5d3SJohn Marino 			line[dpos++] = ' ';
344*86d7f5d3SJohn Marino 		}
345*86d7f5d3SJohn Marino 	}
346*86d7f5d3SJohn Marino }
347