Description: Switch to system iswspace() function This patch replaces calls to _XmDataFieldIsWSpace() in lib/Xm/DataF.c and _XmTextFieldIsWSpace() in lib/Xm/TextF.c with calls to the system iswspace() function. . It fixes an array bounds error in lib/Xm/DataF.c where _XmDataFieldIsWSpace() is called with num_entries = 3. Author: Graham Inggs Forwarded: http://bugs.motifzone.net/show_bug.cgi?id=1629 Last-Update: 2013-11-18 --- a/lib/Xm/DataF.c +++ b/lib/Xm/DataF.c @@ -208,7 +208,6 @@ static Boolean df_VerifyLeave() ; static Boolean _XmDataFieldIsWordBoundary() ; static int _XmGetImage(Screen *, char *, XImage **); -static Boolean _XmDataFieldIsWSpace() ; static void df_FindWord() ; static void df_FindPrevWord() ; static void df_FindNextWord() ; @@ -549,10 +548,6 @@ XmDataFieldWidget tf, XmTextPosition pos1, XmTextPosition pos2) ; -static Boolean _XmDataFieldIsWSpace( - wchar_t wide_char, - wchar_t *white_space, - int num_entries) ; static void df_FindWord( XmDataFieldWidget tf, XmTextPosition begin, @@ -4549,40 +4544,6 @@ return False; } -/* This routine accepts an array of wchar_t's containing wchar encodings - * of whitespace characters (and the number of array elements), comparing - * the wide character passed to each element of the array. If a match - * is found, we got a white space. This routine exists only because - * iswspace(3c) is not yet standard. If a system has isw* available, - * calls to this routine should be changed to iswspace(3c) (and callers - * should delete initialization of the array), and this routine should - * be deleted. Its a stop gap measure to avoid allocating an instance - * variable for the white_space array and/or declaring a widget wide - * global for the data and using a macro. Its ugly, but it works and - * in the long run will be replaced by standard functionality. */ - -/* ARGSUSED */ -static Boolean -#ifdef _NO_PROTO -_XmDataFieldIsWSpace( wide_char, white_space, num_entries ) - wchar_t wide_char ; - wchar_t * white_space ; - int num_entries ; -#else -_XmDataFieldIsWSpace( - wchar_t wide_char, - wchar_t * white_space , - int num_entries ) -#endif /* _NO_PROTO */ -{ - int i; - - for (i=num_entries; i > 0; i--){ - if (wide_char == white_space[i]) return True; - } - return False; -} - static void #ifdef _NO_PROTO df_FindWord( tf, begin, left, right ) @@ -4599,7 +4560,6 @@ #endif /* _NO_PROTO */ { XmTextPosition start, end; - wchar_t white_space[3]; if (XmTextF_max_char_size(tf) == 1) { for (start = begin; start > 0; start--) { @@ -4617,11 +4577,8 @@ } *right = end - 1; } else { /* check for iswspace and iswordboundary in each direction */ - (void)mbtowc(&white_space[0], " ", 1); - (void)mbtowc(&white_space[1], "\n", 1); - (void)mbtowc(&white_space[2], "\t", 1); for (start = begin; start > 0; start --) { - if (_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[start-1],white_space, 3) + if (iswspace(XmTextF_wc_value(tf)[start-1]) || _XmDataFieldIsWordBoundary(tf, (XmTextPosition) start - 1, start)) { break; @@ -4630,7 +4587,7 @@ *left = start; for (end = begin; end <= XmTextF_string_length(tf); end++) { - if (_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[end], white_space, 3)){ + if (iswspace(XmTextF_wc_value(tf)[end])){ end++; break; } else if (end < XmTextF_string_length(tf)) { @@ -4659,14 +4616,6 @@ { XmTextPosition start = XmTextF_cursor_position(tf); - wchar_t white_space[3]; - - if (XmTextF_max_char_size(tf) != 1) { - (void)mbtowc(&white_space[0], " ", 1); - (void)mbtowc(&white_space[1], "\n", 1); - (void)mbtowc(&white_space[2], "\t", 1); - } - if (XmTextF_max_char_size(tf) == 1) { if ((start > 0) && @@ -4680,11 +4629,9 @@ } df_FindWord(tf, start, left, right); } else { - if ((start > 0) && (_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[start - 1], - white_space, 3))) { + if ((start > 0) && (iswspace(XmTextF_wc_value(tf)[start - 1]))) { for (; start > 0; start--) { - if (!_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[start -1], - white_space, 3)){ + if (!iswspace(XmTextF_wc_value(tf)[start -1])){ start--; break; } @@ -4713,14 +4660,6 @@ { XmTextPosition end = XmTextF_cursor_position(tf); - wchar_t white_space[3]; - - if (XmTextF_max_char_size(tf) != 1) { - (void)mbtowc(&white_space[0], " ", 1); - (void)mbtowc(&white_space[1], "\n", 1); - (void)mbtowc(&white_space[2], "\t", 1); - } - if(XmTextF_max_char_size(tf) == 1) { if (isspace((int)(unsigned char)XmTextF_value(tf)[end])) { @@ -4742,9 +4681,9 @@ if (*right < XmTextF_string_length(tf)) *right = *right - 1; } else { - if (_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[end], white_space, 3)) { + if (iswspace(XmTextF_wc_value(tf)[end])) { for ( ; end < XmTextF_string_length(tf); end ++) { - if (!_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[end], white_space, 3)) { + if (!iswspace(XmTextF_wc_value(tf)[end])) { break; } } @@ -4758,10 +4697,9 @@ * If word boundary caused by whitespace, set right to the last * whitespace following the end of the current word. */ - if (_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[(int)*right], white_space, 3)) { + if (iswspace(XmTextF_wc_value(tf)[(int)*right])) { while (*right < XmTextF_string_length(tf) && - _XmDataFieldIsWSpace(XmTextF_wc_value(tf)[(int)*right], - white_space, 3)) { + iswspace(XmTextF_wc_value(tf)[(int)*right])) { *right = *right + 1; } if (*right < XmTextF_string_length(tf)) @@ -5872,13 +5810,6 @@ { XmDataFieldWidget tf = (XmDataFieldWidget) w; XmTextPosition cursorPos, position, dummy; - wchar_t white_space[3]; - - if (XmTextF_max_char_size(tf) != 1) { - (void)mbtowc(&white_space[0], " ", 1); - (void)mbtowc(&white_space[1], "\n", 1); - (void)mbtowc(&white_space[2], "\t", 1); - } cursorPos = XmTextF_cursor_position(tf); @@ -5896,16 +5827,13 @@ } } } else { - if (_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[cursorPos], - white_space, 3)) + if (iswspace(XmTextF_wc_value(tf)[cursorPos])) df_FindWord(tf, cursorPos, &dummy, &position); else df_FindNextWord(tf, &dummy, &position); - if (_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[position], - white_space, 3)){ + if (iswspace(XmTextF_wc_value(tf)[position])){ for (; position < XmTextF_string_length(tf); position++) { - if (!_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[position], - white_space, 3)) + if (!iswspace(XmTextF_wc_value(tf)[position])) break; } } --- a/lib/Xm/TextF.c +++ b/lib/Xm/TextF.c @@ -360,10 +360,6 @@ XmTextPosition pos1, XmTextPosition pos2); -static Boolean _XmTextFieldIsWSpace(wchar_t wide_char, - wchar_t *white_space, - int num_entries); - static void FindWord(XmTextFieldWidget tf, XmTextPosition begin, XmTextPosition *left, @@ -3514,32 +3510,6 @@ return False; } -/* This routine accepts an array of wchar_t's containing wchar encodings - * of whitespace characters (and the number of array elements), comparing - * the wide character passed to each element of the array. If a match - * is found, we got a white space. This routine exists only because - * iswspace(3c) is not yet standard. If a system has isw* available, - * calls to this routine should be changed to iswspace(3c) (and callers - * should delete initialization of the array), and this routine should - * be deleted. Its a stop gap measure to avoid allocating an instance - * variable for the white_space array and/or declaring a widget wide - * global for the data and using a macro. Its ugly, but it works and - * in the long run will be replaced by standard functionality. */ - -/* ARGSUSED */ -static Boolean -_XmTextFieldIsWSpace(wchar_t wide_char, - wchar_t * white_space , - int num_entries) -{ - int i; - - for (i=0; i < num_entries; i++) { - if (wide_char == white_space[i]) return True; - } - return False; -} - static void FindWord(XmTextFieldWidget tf, XmTextPosition begin, @@ -3547,7 +3517,6 @@ XmTextPosition *right) { XmTextPosition start, end; - wchar_t white_space[3]; if (tf->text.max_char_size == 1) { for (start = begin; start > 0; start--) { @@ -3565,11 +3534,8 @@ } *right = end - 1; } else { /* check for iswspace and iswordboundary in each direction */ - (void)mbtowc(&white_space[0], " ", 1); - (void)mbtowc(&white_space[1], "\n", 1); - (void)mbtowc(&white_space[2], "\t", 1); for (start = begin; start > 0; start --) { - if (_XmTextFieldIsWSpace(TextF_WcValue(tf)[start-1],white_space, 3) + if (iswspace(TextF_WcValue(tf)[start-1]) || _XmTextFieldIsWordBoundary(tf, (XmTextPosition) start - 1, start)) { break; @@ -3578,7 +3544,7 @@ *left = start; for (end = begin; end <= tf->text.string_length; end++) { - if (_XmTextFieldIsWSpace(TextF_WcValue(tf)[end], white_space, 3)) { + if (iswspace(TextF_WcValue(tf)[end])) { end++; break; } else if (end < tf->text.string_length) { @@ -3599,14 +3565,6 @@ { XmTextPosition start = TextF_CursorPosition(tf); - wchar_t white_space[3]; - - if (tf->text.max_char_size != 1) { - (void)mbtowc(&white_space[0], " ", 1); - (void)mbtowc(&white_space[1], "\n", 1); - (void)mbtowc(&white_space[2], "\t", 1); - } - if (tf->text.max_char_size == 1) { if ((start > 0) && @@ -3620,11 +3578,9 @@ } FindWord(tf, start, left, right); } else { - if ((start > 0) && (_XmTextFieldIsWSpace(TextF_WcValue(tf)[start - 1], - white_space, 3))) { + if ((start > 0) && (iswspace(TextF_WcValue(tf)[start - 1]))) { for (; start > 0; start--) { - if (!_XmTextFieldIsWSpace(TextF_WcValue(tf)[start -1], - white_space, 3)) { + if (!iswspace(TextF_WcValue(tf)[start -1])) { start--; break; } @@ -3645,14 +3601,6 @@ { XmTextPosition end = TextF_CursorPosition(tf); - wchar_t white_space[3]; - - if (tf->text.max_char_size != 1) { - (void)mbtowc(&white_space[0], " ", 1); - (void)mbtowc(&white_space[1], "\n", 1); - (void)mbtowc(&white_space[2], "\t", 1); - } - if(tf->text.max_char_size == 1) { if (isspace((unsigned char)TextF_Value(tf)[end])) { @@ -3674,9 +3622,9 @@ if (*right < tf->text.string_length) *right = *right - 1; } else { - if (_XmTextFieldIsWSpace(TextF_WcValue(tf)[end], white_space, 3)) { + if (iswspace(TextF_WcValue(tf)[end])) { for (; end < tf->text.string_length; end ++) { - if (!_XmTextFieldIsWSpace(TextF_WcValue(tf)[end], white_space, 3)) { + if (!iswspace(TextF_WcValue(tf)[end])) { break; } } @@ -3690,10 +3638,9 @@ * If word boundary caused by whitespace, set right to the last * whitespace following the end of the current word. */ - if (_XmTextFieldIsWSpace(TextF_WcValue(tf)[(int)*right], white_space, 3)) { + if (iswspace(TextF_WcValue(tf)[(int)*right])) { while (*right < tf->text.string_length && - _XmTextFieldIsWSpace(TextF_WcValue(tf)[(int)*right], - white_space, 3)) { + iswspace(TextF_WcValue(tf)[(int)*right])) { *right = *right + 1; } if (*right < tf->text.string_length) @@ -4546,13 +4493,6 @@ { XmTextFieldWidget tf = (XmTextFieldWidget) w; XmTextPosition cursorPos, position, dummy; - wchar_t white_space[3]; - - if (tf->text.max_char_size != 1) { - (void)mbtowc(&white_space[0], " ", 1); - (void)mbtowc(&white_space[1], "\n", 1); - (void)mbtowc(&white_space[2], "\t", 1); - } cursorPos = TextF_CursorPosition(tf); @@ -4570,16 +4510,13 @@ } } } else { - if (_XmTextFieldIsWSpace(TextF_WcValue(tf)[cursorPos], - white_space, 3)) + if (iswspace(TextF_WcValue(tf)[cursorPos])) FindWord(tf, cursorPos, &dummy, &position); else FindNextWord(tf, &dummy, &position); - if (_XmTextFieldIsWSpace(TextF_WcValue(tf)[position], - white_space, 3)) { + if (iswspace(TextF_WcValue(tf)[position])) { for (; position < tf->text.string_length; position++) { - if (!_XmTextFieldIsWSpace(TextF_WcValue(tf)[position], - white_space, 3)) + if (!iswspace(TextF_WcValue(tf)[position])) break; } }