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