Added UTF8 multibyte to wide char printing in some apps (#106)
* Added UTF8 multibyte to wide char printing in some apps * Fix test compile * Reduce diff churn Co-authored-by: Steve Karg <skarg@users.sourceforge.net>
This commit is contained in:
@@ -31,6 +31,9 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <time.h> /* for time */
|
#include <time.h> /* for time */
|
||||||
|
#ifdef __STDC_ISO_10646__
|
||||||
|
#include <locale.h>
|
||||||
|
#endif
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include "bacnet/config.h"
|
#include "bacnet/config.h"
|
||||||
@@ -1438,6 +1441,17 @@ int main(int argc, char *argv[])
|
|||||||
address_init();
|
address_init();
|
||||||
Init_Service_Handlers();
|
Init_Service_Handlers();
|
||||||
dlenv_init();
|
dlenv_init();
|
||||||
|
#ifdef __STDC_ISO_10646__
|
||||||
|
/* Internationalized programs must call setlocale()
|
||||||
|
* to initiate a specific language operation.
|
||||||
|
* This can be done by calling setlocale() as follows.
|
||||||
|
* If your native locale doesn't use UTF-8 encoding
|
||||||
|
* you need to replace the empty string with a
|
||||||
|
* locale like "en_US.utf8" which is the same as the string
|
||||||
|
* used in the enviromental variable "LANG=en_US.UTF-8".
|
||||||
|
*/
|
||||||
|
setlocale(LC_ALL, "");
|
||||||
|
#endif
|
||||||
atexit(datalink_cleanup);
|
atexit(datalink_cleanup);
|
||||||
|
|
||||||
/* configure the timeout values */
|
/* configure the timeout values */
|
||||||
|
|||||||
@@ -29,6 +29,9 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <time.h> /* for time */
|
#include <time.h> /* for time */
|
||||||
|
#ifdef __STDC_ISO_10646__
|
||||||
|
#include <locale.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define PRINT_ENABLED 1
|
#define PRINT_ENABLED 1
|
||||||
|
|
||||||
@@ -363,6 +366,17 @@ int main(int argc, char *argv[])
|
|||||||
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
|
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
|
||||||
Init_Service_Handlers();
|
Init_Service_Handlers();
|
||||||
dlenv_init();
|
dlenv_init();
|
||||||
|
#ifdef __STDC_ISO_10646__
|
||||||
|
/* Internationalized programs must call setlocale()
|
||||||
|
* to initiate a specific language operation.
|
||||||
|
* This can be done by calling setlocale() as follows.
|
||||||
|
* If your native locale doesn't use UTF-8 encoding
|
||||||
|
* you need to replace the empty string with a
|
||||||
|
* locale like "en_US.utf8" which is the same as the string
|
||||||
|
* used in the enviromental variable "LANG=en_US.UTF-8".
|
||||||
|
*/
|
||||||
|
setlocale(LC_ALL, "");
|
||||||
|
#endif
|
||||||
atexit(datalink_cleanup);
|
atexit(datalink_cleanup);
|
||||||
/* configure the timeout values */
|
/* configure the timeout values */
|
||||||
last_seconds = time(NULL);
|
last_seconds = time(NULL);
|
||||||
|
|||||||
@@ -29,6 +29,9 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <time.h> /* for time */
|
#include <time.h> /* for time */
|
||||||
|
#ifdef __STDC_ISO_10646__
|
||||||
|
#include <locale.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define PRINT_ENABLED 1
|
#define PRINT_ENABLED 1
|
||||||
|
|
||||||
@@ -423,6 +426,17 @@ int main(int argc, char *argv[])
|
|||||||
address_init();
|
address_init();
|
||||||
Init_Service_Handlers();
|
Init_Service_Handlers();
|
||||||
dlenv_init();
|
dlenv_init();
|
||||||
|
#ifdef __STDC_ISO_10646__
|
||||||
|
/* Internationalized programs must call setlocale()
|
||||||
|
* to initiate a specific language operation.
|
||||||
|
* This can be done by calling setlocale() as follows.
|
||||||
|
* If your native locale doesn't use UTF-8 encoding
|
||||||
|
* you need to replace the empty string with a
|
||||||
|
* locale like "en_US.utf8" which is the same as the string
|
||||||
|
* used in the enviromental variable "LANG=en_US.UTF-8".
|
||||||
|
*/
|
||||||
|
setlocale(LC_ALL, "");
|
||||||
|
#endif
|
||||||
atexit(datalink_cleanup);
|
atexit(datalink_cleanup);
|
||||||
/* configure the timeout values */
|
/* configure the timeout values */
|
||||||
last_seconds = time(NULL);
|
last_seconds = time(NULL);
|
||||||
|
|||||||
@@ -31,6 +31,9 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <time.h> /* for time */
|
#include <time.h> /* for time */
|
||||||
|
#ifdef __STDC_ISO_10646__
|
||||||
|
#include <locale.h>
|
||||||
|
#endif
|
||||||
#include "bacnet/bacdef.h"
|
#include "bacnet/bacdef.h"
|
||||||
#include "bacnet/config.h"
|
#include "bacnet/config.h"
|
||||||
#include "bacnet/bactext.h"
|
#include "bacnet/bactext.h"
|
||||||
@@ -320,6 +323,17 @@ int main(int argc, char *argv[])
|
|||||||
address_init();
|
address_init();
|
||||||
Init_Service_Handlers();
|
Init_Service_Handlers();
|
||||||
dlenv_init();
|
dlenv_init();
|
||||||
|
#ifdef __STDC_ISO_10646__
|
||||||
|
/* Internationalized programs must call setlocale()
|
||||||
|
* to initiate a specific language operation.
|
||||||
|
* This can be done by calling setlocale() as follows.
|
||||||
|
* If your native locale doesn't use UTF-8 encoding
|
||||||
|
* you need to replace the empty string with a
|
||||||
|
* locale like "en_US.utf8" which is the same as the string
|
||||||
|
* used in the enviromental variable "LANG=en_US.UTF-8".
|
||||||
|
*/
|
||||||
|
setlocale(LC_ALL, "");
|
||||||
|
#endif
|
||||||
atexit(datalink_cleanup);
|
atexit(datalink_cleanup);
|
||||||
/* configure the timeout values */
|
/* configure the timeout values */
|
||||||
last_seconds = time(NULL);
|
last_seconds = time(NULL);
|
||||||
|
|||||||
+55
-12
@@ -35,8 +35,12 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h> /* for strtol */
|
||||||
#include <ctype.h>
|
#include <ctype.h> /* for isalnum */
|
||||||
|
#ifdef __STDC_ISO_10646__
|
||||||
|
#include <wchar.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
#endif
|
||||||
#include "bacnet/bacenum.h"
|
#include "bacnet/bacenum.h"
|
||||||
#include "bacnet/bacdcode.h"
|
#include "bacnet/bacdcode.h"
|
||||||
#include "bacnet/bacint.h"
|
#include "bacnet/bacint.h"
|
||||||
@@ -1038,6 +1042,12 @@ int bacapp_snprintf_value(
|
|||||||
char *p_str = str;
|
char *p_str = str;
|
||||||
size_t rem_str_len = str_len;
|
size_t rem_str_len = str_len;
|
||||||
char temp_str[32];
|
char temp_str[32];
|
||||||
|
#ifdef __STDC_ISO_10646__
|
||||||
|
/* Wide character (decoded from multi-byte character). */
|
||||||
|
wchar_t wc;
|
||||||
|
/* Wide character length in bytes. */
|
||||||
|
int wclen;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (object_value && object_value->value) {
|
if (object_value && object_value->value) {
|
||||||
value = object_value->value;
|
value = object_value->value;
|
||||||
@@ -1102,17 +1112,50 @@ int bacapp_snprintf_value(
|
|||||||
char_str = characterstring_value(&value->type.Character_String);
|
char_str = characterstring_value(&value->type.Character_String);
|
||||||
if (!append_str(&p_str, &rem_str_len, "\"")) {
|
if (!append_str(&p_str, &rem_str_len, "\"")) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for (i = 0; i < len; i++) {
|
#ifdef __STDC_ISO_10646__
|
||||||
if (isprint(*((unsigned char *)char_str))) {
|
if (characterstring_encoding(&value->type.Character_String) ==
|
||||||
snprintf(temp_str, sizeof(temp_str), "%c", *char_str);
|
CHARACTER_UTF8) {
|
||||||
} else {
|
while (len > 0) {
|
||||||
snprintf(temp_str, sizeof(temp_str), "%c", '.');
|
wclen = mbtowc(&wc, char_str, MB_CUR_MAX);
|
||||||
|
if (wclen == -1) {
|
||||||
|
/* Encoding error, reset state: */
|
||||||
|
mbtowc(NULL, NULL, MB_CUR_MAX);
|
||||||
|
/* After handling an invalid byte,
|
||||||
|
retry with the next one. */
|
||||||
|
wclen = 1;
|
||||||
|
wc = L'?';
|
||||||
|
} else {
|
||||||
|
if (!iswprint(wc)) {
|
||||||
|
wc = L'.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
snprintf(temp_str, sizeof(temp_str), "%lc", wc);
|
||||||
|
if (!append_str(&p_str, &rem_str_len, temp_str)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (len > wclen) {
|
||||||
|
len -= wclen;
|
||||||
|
char_str += wclen;
|
||||||
|
} else {
|
||||||
|
len = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
if (isprint(*((unsigned char *)char_str))) {
|
||||||
|
snprintf(temp_str, sizeof(temp_str), "%c",
|
||||||
|
*char_str);
|
||||||
|
} else {
|
||||||
|
snprintf(temp_str, sizeof(temp_str), "%c", '.');
|
||||||
|
}
|
||||||
|
if (!append_str(&p_str, &rem_str_len, temp_str)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
char_str++;
|
||||||
}
|
}
|
||||||
if (!append_str(&p_str, &rem_str_len, temp_str)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
char_str++;
|
|
||||||
}
|
}
|
||||||
if ((i == len) && append_str(&p_str, &rem_str_len, "\"")) {
|
if ((i == len) && append_str(&p_str, &rem_str_len, "\"")) {
|
||||||
/* Everything is fine. Indicate how many bytes were */
|
/* Everything is fine. Indicate how many bytes were */
|
||||||
|
|||||||
Reference in New Issue
Block a user