1 /**************************************************************************** 2 * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * 3 * * 4 * Permission is hereby granted, free of charge, to any person obtaining a * 5 * copy of this software and associated documentation files (the * 6 * "Software"), to deal in the Software without restriction, including * 7 * without limitation the rights to use, copy, modify, merge, publish, * 8 * distribute, distribute with modifications, sublicense, and/or sell * 9 * copies of the Software, and to permit persons to whom the Software is * 10 * furnished to do so, subject to the following conditions: * 11 * * 12 * The above copyright notice and this permission notice shall be included * 13 * in all copies or substantial portions of the Software. * 14 * * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 22 * * 23 * Except as contained in this notice, the name(s) of the above copyright * 24 * holders shall not be used in advertising or otherwise to promote the * 25 * sale, use or other dealings in this Software without prior written * 26 * authorization. * 27 ****************************************************************************/ 28 29 /**************************************************************************** 30 * Author: Juergen Pfeifer * 31 * and: Thomas E. Dickey * 32 ****************************************************************************/ 33 34 /* 35 * lib_slkset.c 36 * Set soft label text. 37 */ 38 #include <curses.priv.h> 39 #include <ctype.h> 40 41 #if USE_WIDEC_SUPPORT 42 #if HAVE_WCTYPE_H 43 #include <wctype.h> 44 #endif 45 #endif 46 47 MODULE_ID("$Id: lib_slkset.c,v 1.21 2010/12/25 23:43:58 tom Exp $") 48 49 NCURSES_EXPORT(int) 50 NCURSES_SP_NAME(slk_set) (NCURSES_SP_DCLx int i, const char *astr, int format) 51 { 52 SLK *slk; 53 int offset; 54 int numchrs; 55 int numcols; 56 int limit; 57 const char *str = astr; 58 const char *p; 59 60 T((T_CALLED("slk_set(%p, %d, \"%s\", %d)"), (void *) SP_PARM, i, str, format)); 61 62 if (SP_PARM == 0 63 || (slk = SP_PARM->_slk) == 0 64 || i < 1 65 || i > slk->labcnt 66 || format < 0 67 || format > 2) 68 returnCode(ERR); 69 if (str == 0) 70 str = ""; 71 --i; /* Adjust numbering of labels */ 72 73 limit = MAX_SKEY_LEN(SP_PARM->slk_format); 74 while (isspace(UChar(*str))) 75 str++; /* skip over leading spaces */ 76 p = str; 77 78 #if USE_WIDEC_SUPPORT 79 numcols = 0; 80 while (*p != 0) { 81 mbstate_t state; 82 wchar_t wc; 83 size_t need; 84 85 init_mb(state); 86 need = mbrtowc(0, p, strlen(p), &state); 87 if (need == (size_t) -1) 88 break; 89 mbrtowc(&wc, p, need, &state); 90 if (!iswprint((wint_t) wc)) 91 break; 92 if (wcwidth(wc) + numcols > limit) 93 break; 94 numcols += wcwidth(wc); 95 p += need; 96 } 97 numchrs = (int) (p - str); 98 #else 99 while (isprint(UChar(*p))) 100 p++; /* The first non-print stops */ 101 102 numcols = (int) (p - str); 103 if (numcols > limit) 104 numcols = limit; 105 numchrs = numcols; 106 #endif 107 108 FreeIfNeeded(slk->ent[i].ent_text); 109 if ((slk->ent[i].ent_text = strdup(str)) == 0) 110 returnCode(ERR); 111 slk->ent[i].ent_text[numchrs] = '\0'; 112 113 if ((slk->ent[i].form_text = (char *) _nc_doalloc(slk->ent[i].form_text, 114 (unsigned) (limit + 115 numchrs + 1)) 116 ) == 0) 117 returnCode(ERR); 118 119 switch (format) { 120 default: 121 case 0: /* left-justified */ 122 offset = 0; 123 break; 124 case 1: /* centered */ 125 offset = (limit - numcols) / 2; 126 break; 127 case 2: /* right-justified */ 128 offset = limit - numcols; 129 break; 130 } 131 if (offset <= 0) 132 offset = 0; 133 else 134 memset(slk->ent[i].form_text, ' ', (unsigned) offset); 135 136 memcpy(slk->ent[i].form_text + offset, 137 slk->ent[i].ent_text, 138 (unsigned) numchrs); 139 140 if (offset < limit) { 141 memset(slk->ent[i].form_text + offset + numchrs, 142 ' ', 143 (unsigned) (limit - (offset + numcols))); 144 } 145 146 slk->ent[i].form_text[numchrs - numcols + limit] = 0; 147 slk->ent[i].dirty = TRUE; 148 returnCode(OK); 149 } 150 151 #if NCURSES_SP_FUNCS 152 NCURSES_EXPORT(int) 153 slk_set(int i, const char *astr, int format) 154 { 155 return NCURSES_SP_NAME(slk_set) (CURRENT_SCREEN, i, astr, format); 156 } 157 #endif 158