150276Speter/****************************************************************************
2174993Srafan * Copyright (c) 1998-2005,2007 Free Software Foundation, Inc.              *
350276Speter *                                                                          *
450276Speter * Permission is hereby granted, free of charge, to any person obtaining a  *
550276Speter * copy of this software and associated documentation files (the            *
650276Speter * "Software"), to deal in the Software without restriction, including      *
750276Speter * without limitation the rights to use, copy, modify, merge, publish,      *
850276Speter * distribute, distribute with modifications, sublicense, and/or sell       *
950276Speter * copies of the Software, and to permit persons to whom the Software is    *
1050276Speter * furnished to do so, subject to the following conditions:                 *
1150276Speter *                                                                          *
1250276Speter * The above copyright notice and this permission notice shall be included  *
1350276Speter * in all copies or substantial portions of the Software.                   *
1450276Speter *                                                                          *
1550276Speter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
1650276Speter * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
1750276Speter * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
1850276Speter * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
1950276Speter * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
2050276Speter * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
2150276Speter * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
2250276Speter *                                                                          *
2350276Speter * Except as contained in this notice, the name(s) of the above copyright   *
2450276Speter * holders shall not be used in advertising or otherwise to promote the     *
2550276Speter * sale, use or other dealings in this Software without prior written       *
2650276Speter * authorization.                                                           *
2750276Speter ****************************************************************************/
2850276Speter
2950276Speter/****************************************************************************
30166124Srafan *  Author: Juergen Pfeifer                                                 *
31166124Srafan *     and: Thomas E. Dickey                                                *
3250276Speter ****************************************************************************/
3350276Speter
3450276Speter/*
3550276Speter *	lib_slkset.c
3650276Speter *      Set soft label text.
3750276Speter */
3850276Speter#include <curses.priv.h>
3950276Speter#include <ctype.h>
4050276Speter
41166124Srafan#if USE_WIDEC_SUPPORT
42166124Srafan#if HAVE_WCTYPE_H
43166124Srafan#include <wctype.h>
44166124Srafan#endif
45166124Srafan#endif
4650276Speter
47174993SrafanMODULE_ID("$Id: lib_slkset.c,v 1.17 2007/10/13 20:08:46 tom Exp $")
48166124Srafan
4976726SpeterNCURSES_EXPORT(int)
5050276Speterslk_set(int i, const char *astr, int format)
5150276Speter{
52174993Srafan    SLK *slk;
53166124Srafan    int offset;
54166124Srafan    int numchrs;
55166124Srafan    int numcols;
56166124Srafan    int limit;
5776726Speter    const char *str = astr;
5876726Speter    const char *p;
5950276Speter
6076726Speter    T((T_CALLED("slk_set(%d, \"%s\", %d)"), i, str, format));
6150276Speter
62174993Srafan    if (SP == 0
63174993Srafan	|| (slk = SP->_slk) == 0
64174993Srafan	|| i < 1
65174993Srafan	|| i > slk->labcnt
66174993Srafan	|| format < 0
67174993Srafan	|| format > 2)
6876726Speter	returnCode(ERR);
6976726Speter    if (str == NULL)
7076726Speter	str = "";
71166124Srafan    --i;			/* Adjust numbering of labels */
7250276Speter
73166124Srafan    limit = MAX_SKEY_LEN(SP->slk_format);
7497049Speter    while (isspace(UChar(*str)))
7576726Speter	str++;			/* skip over leading spaces  */
7676726Speter    p = str;
77166124Srafan
78166124Srafan#if USE_WIDEC_SUPPORT
79166124Srafan    numcols = 0;
80166124Srafan    while (*p != 0) {
81166124Srafan	mbstate_t state;
82166124Srafan	wchar_t wc;
83166124Srafan	size_t need;
84166124Srafan
85166124Srafan	init_mb(state);
86166124Srafan	need = mbrtowc(0, p, strlen(p), &state);
87166124Srafan	if (need == (size_t) -1)
88166124Srafan	    break;
89166124Srafan	mbrtowc(&wc, p, need, &state);
90166124Srafan	if (!iswprint((wint_t) wc))
91166124Srafan	    break;
92166124Srafan	if (wcwidth(wc) + numcols > limit)
93166124Srafan	    break;
94166124Srafan	numcols += wcwidth(wc);
95166124Srafan	p += need;
96166124Srafan    }
97166124Srafan    numchrs = (p - str);
98166124Srafan#else
9997049Speter    while (isprint(UChar(*p)))
10076726Speter	p++;			/* The first non-print stops */
10150276Speter
102166124Srafan    numcols = (p - str);
103166124Srafan    if (numcols > limit)
104166124Srafan	numcols = limit;
105166124Srafan    numchrs = numcols;
106166124Srafan#endif
10750276Speter
108166124Srafan    FreeIfNeeded(slk->ent[i].ent_text);
109166124Srafan    if ((slk->ent[i].ent_text = strdup(str)) == 0)
110166124Srafan	returnCode(ERR);
111166124Srafan    slk->ent[i].ent_text[numchrs] = '\0';
11250276Speter
113166124Srafan    if ((slk->ent[i].form_text = (char *) _nc_doalloc(slk->ent[i].form_text,
114166124Srafan						      (unsigned) (limit +
115166124Srafan								  numchrs + 1))
116166124Srafan	) == 0)
117166124Srafan	returnCode(ERR);
118166124Srafan
11976726Speter    switch (format) {
120166124Srafan    default:
12176726Speter    case 0:			/* left-justified */
122166124Srafan	offset = 0;
12376726Speter	break;
12476726Speter    case 1:			/* centered */
125166124Srafan	offset = (limit - numcols) / 2;
12676726Speter	break;
12776726Speter    case 2:			/* right-justified */
128166124Srafan	offset = limit - numcols;
12976726Speter	break;
13076726Speter    }
131166124Srafan    if (offset <= 0)
132166124Srafan	offset = 0;
133166124Srafan    else
134166124Srafan	memset(slk->ent[i].form_text, ' ', (unsigned) offset);
135166124Srafan
136166124Srafan    memcpy(slk->ent[i].form_text + offset,
137166124Srafan	   slk->ent[i].ent_text,
138166124Srafan	   (unsigned) numchrs);
139166124Srafan
140166124Srafan    if (offset < limit) {
141166124Srafan	memset(slk->ent[i].form_text + offset + numchrs,
142166124Srafan	       ' ',
143166124Srafan	       (unsigned) (limit - (offset + numcols)));
144166124Srafan    }
145166124Srafan
146166124Srafan    slk->ent[i].form_text[numchrs - numcols + limit] = 0;
14776726Speter    slk->ent[i].dirty = TRUE;
14876726Speter    returnCode(OK);
14950276Speter}
150