summaryrefslogtreecommitdiff
path: root/repo/x11/motif/17-switch-to-system-iswspace.patch
diff options
context:
space:
mode:
Diffstat (limited to 'repo/x11/motif/17-switch-to-system-iswspace.patch')
-rw-r--r--repo/x11/motif/17-switch-to-system-iswspace.patch384
1 files changed, 384 insertions, 0 deletions
diff --git a/repo/x11/motif/17-switch-to-system-iswspace.patch b/repo/x11/motif/17-switch-to-system-iswspace.patch
new file mode 100644
index 0000000..a77b879
--- /dev/null
+++ b/repo/x11/motif/17-switch-to-system-iswspace.patch
@@ -0,0 +1,384 @@
+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 <graham@nerve.org.za>
+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;
+ }
+ }