diff options
author | Vincent Sanders <vince@netsurf-browser.org> | 2014-01-28 21:40:13 +0000 |
---|---|---|
committer | Vincent Sanders <vince@netsurf-browser.org> | 2014-01-28 21:40:13 +0000 |
commit | 654da2ffb5abf2afe9532f1d0cb77ed88f8a97cc (patch) | |
tree | efbc3d97a8650b682b7181e748698de9c555d80d | |
parent | 4b760c7e499e2f5cb1d06242d5f186e14e94496a (diff) | |
download | netsurf-654da2ffb5abf2afe9532f1d0cb77ed88f8a97cc.tar.gz netsurf-654da2ffb5abf2afe9532f1d0cb77ed88f8a97cc.tar.bz2 |
move utf8 conversion routines to use nserror instead of their own error enum
37 files changed, 365 insertions, 358 deletions
diff --git a/amiga/clipboard.c b/amiga/clipboard.c index 8df441e02..d39e89e4a 100644 --- a/amiga/clipboard.c +++ b/amiga/clipboard.c @@ -246,7 +246,7 @@ static void gui_set_clipboard(const char *buffer, size_t length, if(nsoption_bool(clipboard_write_utf8)) { WriteChunkBytes(iffh, buffer, length); } else { - if(utf8_to_local_encoding(buffer, length, &text) == UTF8_CONVERT_OK) { + if(utf8_to_local_encoding(buffer, length, &text) == NSERROR_OK) { char *p; p = text; diff --git a/amiga/font.c b/amiga/font.c index 36c810428..3430a4ea3 100755 --- a/amiga/font.c +++ b/amiga/font.c @@ -212,7 +212,7 @@ bool nsfont_position_in_string(const plot_font_style_t *fstyle, ULONG emwidth = (ULONG)NSA_FONT_EMWIDTH(fstyle->size); int32 tempx; - if(utf8_to_enc(string,"UTF-16",length,(char **)&utf16) != UTF8_CONVERT_OK) return false; + if(utf8_to_enc(string,"UTF-16",length,(char **)&utf16) != NSERROR_OK) return false; outf16 = utf16; if(!(ofont = ami_open_outline_font(fstyle, 0))) return false; @@ -301,7 +301,7 @@ bool nsfont_split(const plot_font_style_t *fstyle, int32 tempx = 0; ULONG emwidth = (ULONG)NSA_FONT_EMWIDTH(fstyle->size); - if(utf8_to_enc((char *)string,"UTF-16",length,(char **)&utf16) != UTF8_CONVERT_OK) return false; + if(utf8_to_enc((char *)string,"UTF-16",length,(char **)&utf16) != NSERROR_OK) return false; outf16 = utf16; if(!(ofont = ami_open_outline_font(fstyle, 0))) return false; @@ -732,7 +732,7 @@ ULONG ami_unicode_text(struct RastPort *rp, const char *string, ULONG length, if(!string || string[0]=='\0') return 0; if(!length) return 0; - if(utf8_to_enc(string,"UTF-16",length,(char **)&utf16) != UTF8_CONVERT_OK) return 0; + if(utf8_to_enc(string,"UTF-16",length,(char **)&utf16) != NSERROR_OK) return 0; outf16 = utf16; if(!(ofont = ami_open_outline_font(fstyle, 0))) return 0; diff --git a/amiga/utf8.c b/amiga/utf8.c index a620ac181..d182492e9 100755 --- a/amiga/utf8.c +++ b/amiga/utf8.c @@ -34,7 +34,7 @@ char *ami_utf8_easy(const char *string) { char *localtext; - if(utf8_to_local_encoding(string,strlen(string),&localtext) == UTF8_CONVERT_OK) + if(utf8_to_local_encoding(string,strlen(string),&localtext) == NSERROR_OK) { return localtext; } @@ -48,7 +48,7 @@ char *ami_to_utf8_easy(const char *string) { char *localtext; - if(utf8_from_local_encoding(string,strlen(string),&localtext) == UTF8_CONVERT_OK) + if(utf8_from_local_encoding(string,strlen(string),&localtext) == NSERROR_OK) { return localtext; } @@ -58,8 +58,7 @@ char *ami_to_utf8_easy(const char *string) } } -utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, - char **result) +nserror utf8_from_local_encoding(const char *string, size_t len, char **result) { const char *encname = "ISO-8859-1"; @@ -73,8 +72,7 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, return utf8_from_enc(string,encname,len,result,NULL); } -utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len, - char **result) +nserror utf8_to_local_encoding(const char *string, size_t len, char **result) { const char *encname = "ISO-8859-1"; diff --git a/atari/encoding.c b/atari/encoding.c index 0212d51c4..626f57ae8 100644 --- a/atari/encoding.c +++ b/atari/encoding.c @@ -21,23 +21,21 @@ /* TODO: this need a rework..., encoding to atari st doesn|t always work. ( gui_add_to_clipboard...) */
-utf8_convert_ret utf8_to_local_encoding(const char *string,
+nserror utf8_to_local_encoding(const char *string,
size_t len,
char **result)
{
- utf8_convert_ret r;
+ nserror r;
r = utf8_to_enc(string, "ATARIST", len, result);
- if(r != UTF8_CONVERT_OK) {
+ if(r != NSERROR_OK) {
r = utf8_to_enc(string, "UTF-8", len, result);
- assert( r == UTF8_CONVERT_OK );
+ assert( r == NSERROR_OK );
}
return r;
}
-utf8_convert_ret utf8_from_local_encoding(const char *string,
- size_t len,
- char **result)
+nserror utf8_from_local_encoding(const char *string, size_t len, char **result) {
return utf8_from_enc(string, "ATARIST", len, result, NULL);
}
diff --git a/atari/gui.c b/atari/gui.c index f1f557e2e..af5e1f8ba 100644 --- a/atari/gui.c +++ b/atari/gui.c @@ -326,7 +326,7 @@ static void gui_window_set_title(struct gui_window *gw, const char *title) int l; char * conv; l = strlen(title)+1; - if (utf8_to_local_encoding(title, l-1, &conv) == UTF8_CONVERT_OK ) { + if (utf8_to_local_encoding(title, l-1, &conv) == NSERROR_OK ) { l = MIN((uint32_t)atari_sysinfo.aes_max_win_title_len, strlen(conv)); if(gw->title == NULL) gw->title = malloc(l); @@ -699,16 +699,16 @@ static void gui_get_clipboard(char **buffer, size_t *length) // clipboard is in atari encoding, convert it to utf8: char *utf8 = NULL; - utf8_convert_ret ret; + nserror ret; clip_len = strlen(clip); if (clip_len > 0) { ret = utf8_to_local_encoding(clip, clip_len, &utf8); - if (ret == UTF8_CONVERT_OK && utf8 != NULL) { + if (ret == NSERROR_OK && utf8 != NULL) { *buffer = utf8; *length = strlen(utf8); } else { - assert(ret == UTF8_CONVERT_OK && utf8 != NULL); + assert(ret == NSERROR_OK && utf8 != NULL); } } @@ -731,14 +731,14 @@ static void gui_set_clipboard(const char *buffer, size_t length, // convert utf8 input to atari encoding: - utf8_convert_ret ret; + nserror ret; char *clip = NULL; ret = utf8_to_local_encoding(buffer,length, &clip); - if (ret == UTF8_CONVERT_OK) { + if (ret == NSERROR_OK) { scrap_txt_write(clip); } else { - assert(ret == UTF8_CONVERT_OK); + assert(ret == NSERROR_OK); } free(clip); } diff --git a/atari/plot/font_internal.c b/atari/plot/font_internal.c index 2b0025a71..e3c806cfe 100644 --- a/atari/plot/font_internal.c +++ b/atari/plot/font_internal.c @@ -72,7 +72,7 @@ fb_get_font(const plot_font_style_t *fstyle) }
}
-static utf8_convert_ret utf8_to_font_encoding(const struct fb_font_desc* font,
+static nserror utf8_to_font_encoding(const struct fb_font_desc* font,
const char *string,
size_t len,
char **result)
diff --git a/atari/plot/font_vdi.c b/atari/plot/font_vdi.c index 340759f02..0c914b82b 100755 --- a/atari/plot/font_vdi.c +++ b/atari/plot/font_vdi.c @@ -267,7 +267,7 @@ static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t leng short fx=0; GRECT canvas;
char *lstr = NULL; - assert( utf8_to_local_encoding(text, length, &lstr) == UTF8_CONVERT_OK);
+ assert( utf8_to_local_encoding(text, length, &lstr) == NSERROR_OK);
assert( lstr != NULL ); int slen = strlen(lstr); diff --git a/atari/rootwin.c b/atari/rootwin.c index 0f3413c3d..8942263ad 100755 --- a/atari/rootwin.c +++ b/atari/rootwin.c @@ -1510,15 +1510,15 @@ static void on_file_dropped(ROOTWIN *rootwin, short msg[8]) mx+sx, my+sy, NULL); if(processed == true) { - utf8_convert_ret ret; + nserror ret; char *utf8_fn; ret = utf8_from_local_encoding(buff, 0, &utf8_fn); - if (ret != UTF8_CONVERT_OK) { + if (ret != NSERROR_OK) { free(buff); /* A bad encoding should never happen */ LOG(("utf8_from_local_encoding failed")); - assert(ret != UTF8_CONVERT_BADENC); + assert(ret != NSERROR_BAD_ENCODING); /* no memory */ goto error; } diff --git a/atari/toolbar.c b/atari/toolbar.c index fd9051dd9..8044d160d 100644 --- a/atari/toolbar.c +++ b/atari/toolbar.c @@ -740,11 +740,11 @@ bool toolbar_key_input(struct s_toolbar *tb, short nkc) int clip_length = strlen( clip );
if ( clip_length > 0 ) {
char *utf8;
- utf8_convert_ret res;
+ nserror res;
/* Clipboard is in local encoding so
* convert to UTF8 */
res = utf8_from_local_encoding( clip, clip_length, &utf8 );
- if ( res == UTF8_CONVERT_OK ) {
+ if ( res == NSERROR_OK ) {
toolbar_set_url(tb, utf8);
free(utf8); ret = true;
diff --git a/beos/gui.cpp b/beos/gui.cpp index 05e06373c..97117e04b 100644 --- a/beos/gui.cpp +++ b/beos/gui.cpp @@ -964,8 +964,7 @@ static void nsbeos_create_ssl_verify_window(struct browser_window *bw, } -utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len, - char **result) +nserror utf8_to_local_encoding(const char *string, size_t len, char **result) { assert(string && result); @@ -974,13 +973,12 @@ utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len, *result = strndup(string, len); if (!(*result)) - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; - return UTF8_CONVERT_OK; + return NSERROR_OK; } -utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, - char **result) +nserror utf8_from_local_encoding(const char *string, size_t len, char **result) { assert(string && result); @@ -989,9 +987,9 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, *result = strndup(string, len); if (!(*result)) - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; - return UTF8_CONVERT_OK; + return NSERROR_OK; } static char *path_to_url(const char *path) diff --git a/cocoa/utf8.m b/cocoa/utf8.m index 2ec829888..7b69918d0 100644 --- a/cocoa/utf8.m +++ b/cocoa/utf8.m @@ -20,21 +20,20 @@ #import "utils/utf8.h" -utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len, +nserror utf8_to_local_encoding(const char *string, size_t len, char **result) { NSCParameterAssert( NULL != result ); char *newString = malloc( len + 1 ); - if (NULL == newString) return UTF8_CONVERT_NOMEM; + if (NULL == newString) return NSERROR_NOMEM; memcpy( newString, string, len ); newString[len] = 0; *result = newString; - return UTF8_CONVERT_OK; + return NSERROR_OK; } -utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, - char **result) +nserror utf8_from_local_encoding(const char *string, size_t len, char **result) { /* same function, local encoding = UTF-8 */ return utf8_to_local_encoding( string, len, result ); diff --git a/desktop/global_history.c b/desktop/global_history.c index e8d99efc2..9d0e47e34 100644 --- a/desktop/global_history.c +++ b/desktop/global_history.c @@ -828,21 +828,21 @@ static nserror global_history_export_enter_cb(void *ctx, void *node_data, enum treeview_node_type type, bool *abort) { struct treeview_export_walk_ctx *tw = ctx; + nserror ret; if (type == TREE_NODE_ENTRY) { struct global_history_entry *e = node_data; - utf8_convert_ret ret; char *t_text; char *u_text; ret = utf8_to_html(e->data[GH_TITLE].value, "iso-8859-1", e->data[GH_TITLE].value_len, &t_text); - if (ret != UTF8_CONVERT_OK) + if (ret != NSERROR_OK) return NSERROR_SAVE_FAILED; ret = utf8_to_html(e->data[GH_URL].value, "iso-8859-1", e->data[GH_URL].value_len, &u_text); - if (ret != UTF8_CONVERT_OK) { + if (ret != NSERROR_OK) { free(t_text); return NSERROR_SAVE_FAILED; } @@ -855,12 +855,11 @@ static nserror global_history_export_enter_cb(void *ctx, void *node_data, } else if (type == TREE_NODE_FOLDER) { struct global_history_folder *f = node_data; - utf8_convert_ret ret; char *f_text; ret = utf8_to_html(f->data.value, "iso-8859-1", f->data.value_len, &f_text); - if (ret != UTF8_CONVERT_OK) + if (ret != NSERROR_OK) return NSERROR_SAVE_FAILED; fprintf(tw->fp, "<li><h4>%s</h4>\n<ul>\n", f_text); diff --git a/desktop/hotlist.c b/desktop/hotlist.c index 01fabc257..219a348ef 100644 --- a/desktop/hotlist.c +++ b/desktop/hotlist.c @@ -879,21 +879,21 @@ static nserror hotlist_export_enter_cb(void *ctx, void *node_data, enum treeview_node_type type, bool *abort) { struct treeview_export_walk_ctx *tw = ctx; + nserror ret; if (type == TREE_NODE_ENTRY) { struct hotlist_entry *e = node_data; - utf8_convert_ret ret; char *t_text; char *u_text; ret = utf8_to_html(e->data[HL_TITLE].value, "iso-8859-1", e->data[HL_TITLE].value_len, &t_text); - if (ret != UTF8_CONVERT_OK) + if (ret != NSERROR_OK) return NSERROR_SAVE_FAILED; ret = utf8_to_html(e->data[HL_URL].value, "iso-8859-1", e->data[HL_URL].value_len, &u_text); - if (ret != UTF8_CONVERT_OK) { + if (ret != NSERROR_OK) { free(t_text); return NSERROR_SAVE_FAILED; } @@ -906,12 +906,11 @@ static nserror hotlist_export_enter_cb(void *ctx, void *node_data, } else if (type == TREE_NODE_FOLDER) { struct hotlist_folder *f = node_data; - utf8_convert_ret ret; char *f_text; ret = utf8_to_html(f->data.value, "iso-8859-1", f->data.value_len, &f_text); - if (ret != UTF8_CONVERT_OK) + if (ret != NSERROR_OK) return NSERROR_SAVE_FAILED; if (f == hl_ctx.default_folder) { diff --git a/desktop/save_complete.c b/desktop/save_complete.c index da87a65fe..99b1ac4b7 100644 --- a/desktop/save_complete.c +++ b/desktop/save_complete.c @@ -547,7 +547,6 @@ static bool save_complete_rewrite_url_value(save_complete_ctx *ctx, hlcache_handle *content; char *escaped; nserror error; - utf8_convert_ret ret; error = nsurl_join(ctx->base, value, &url); if (error == NSERROR_NOMEM) @@ -562,11 +561,11 @@ static bool save_complete_rewrite_url_value(save_complete_ctx *ctx, fprintf(ctx->fp, "\"%p\"", content); } else { /* no match found */ - ret = utf8_to_html(nsurl_access(url), "UTF-8", + error = utf8_to_html(nsurl_access(url), "UTF-8", nsurl_length(url), &escaped); nsurl_unref(url); - if (ret != UTF8_CONVERT_OK) + if (error != NSERROR_OK) return false; fprintf(ctx->fp, "\"%s\"", escaped); @@ -574,8 +573,8 @@ static bool save_complete_rewrite_url_value(save_complete_ctx *ctx, free(escaped); } } else { - ret = utf8_to_html(value, "UTF-8", value_len, &escaped); - if (ret != UTF8_CONVERT_OK) + error = utf8_to_html(value, "UTF-8", value_len, &escaped); + if (error != NSERROR_OK) return false; fprintf(ctx->fp, "\"%s\"", escaped); @@ -590,10 +589,10 @@ static bool save_complete_write_value(save_complete_ctx *ctx, const char *value, size_t value_len) { char *escaped; - utf8_convert_ret ret; + nserror ret; ret = utf8_to_html(value, "UTF-8", value_len, &escaped); - if (ret != UTF8_CONVERT_OK) + if (ret != NSERROR_OK) return false; fprintf(ctx->fp, "\"%s\"", escaped); @@ -919,7 +918,7 @@ static bool save_complete_node_handler(dom_node *node, save_complete_ctx *ctx = ctxin; dom_node_type type; dom_exception error; - utf8_convert_ret ret; + nserror ret; error = dom_node_get_node_type(node, &type); if (error != DOM_NO_ERR) @@ -953,7 +952,7 @@ static bool save_complete_node_handler(dom_node *node, ret = utf8_to_html(text_data, "UTF-8", text_len, &escaped); - if (ret != UTF8_CONVERT_OK) + if (ret != NSERROR_OK) return false; fwrite(escaped, sizeof(*escaped), diff --git a/desktop/save_text.c b/desktop/save_text.c index 92cf32a9f..38f8c5334 100644 --- a/desktop/save_text.c +++ b/desktop/save_text.c @@ -58,7 +58,7 @@ void save_as_text(hlcache_handle *c, char *path) struct save_text_state save = { NULL, 0, 0 }; save_text_whitespace before = WHITESPACE_NONE; bool first = true; - utf8_convert_ret ret; + nserror ret; char *result; if (!c || content_get_type(c) != CONTENT_HTML) { @@ -72,7 +72,7 @@ void save_as_text(hlcache_handle *c, char *path) ret = utf8_to_local_encoding(save.block, save.length, &result); free(save.block); - if (ret != UTF8_CONVERT_OK) { + if (ret != NSERROR_OK) { LOG(("failed to convert to local encoding, return %d", ret)); return; } diff --git a/framebuffer/font_freetype.c b/framebuffer/font_freetype.c index 521a5bc5f..eb7278c81 100644 --- a/framebuffer/font_freetype.c +++ b/framebuffer/font_freetype.c @@ -75,27 +75,27 @@ enum fb_face_e { static fb_faceid_t *fb_faces[FB_FACE_COUNT]; -utf8_convert_ret utf8_to_local_encoding(const char *string, +nserror utf8_to_local_encoding(const char *string, size_t len, char **result) { return utf8_to_enc(string, "UTF-8", len, result); } -utf8_convert_ret utf8_from_local_encoding(const char *string, +nserror utf8_from_local_encoding(const char *string, size_t len, char **result) { *result = malloc(len + 1); if (*result == NULL) { - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; } memcpy(*result, string, len); (*result)[len] = '\0'; - return UTF8_CONVERT_OK; + return NSERROR_OK; } /* map cache manager handle to face id */ diff --git a/framebuffer/font_internal.c b/framebuffer/font_internal.c index dc1b35820..d13ba0032 100644 --- a/framebuffer/font_internal.c +++ b/framebuffer/font_internal.c @@ -59,7 +59,7 @@ fb_get_font(const plot_font_style_t *fstyle) } } -utf8_convert_ret utf8_to_font_encoding(const struct fb_font_desc* font, +nserror_ret utf8_to_font_encoding(const struct fb_font_desc* font, const char *string, size_t len, char **result) @@ -68,7 +68,7 @@ utf8_convert_ret utf8_to_font_encoding(const struct fb_font_desc* font, } -utf8_convert_ret utf8_to_local_encoding(const char *string, +nserror utf8_to_local_encoding(const char *string, size_t len, char **result) { @@ -76,20 +76,20 @@ utf8_convert_ret utf8_to_local_encoding(const char *string, } -utf8_convert_ret utf8_from_local_encoding(const char *string, +nserror utf8_from_local_encoding(const char *string, size_t len, char **result) { *result = malloc(len + 1); if (*result == NULL) { - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; } memcpy(*result, string, len); (*result)[len] = '\0'; - return UTF8_CONVERT_OK; + return NSERROR_OK; } static bool nsfont_width(const plot_font_style_t *fstyle, diff --git a/framebuffer/font_internal.h b/framebuffer/font_internal.h index 5b0f30ba1..6b6de2f34 100644 --- a/framebuffer/font_internal.h +++ b/framebuffer/font_internal.h @@ -33,7 +33,7 @@ extern const struct fb_font_desc font_italic_bold; extern const struct fb_font_desc* fb_get_font(const plot_font_style_t *fstyle); -extern utf8_convert_ret utf8_to_font_encoding(const struct fb_font_desc* font, +extern nserror utf8_to_font_encoding(const struct fb_font_desc* font, const char *string, size_t len, char **result); diff --git a/gtk/dialogs/source.c b/gtk/dialogs/source.c index a7c98152e..a32bce675 100644 --- a/gtk/dialogs/source.c +++ b/gtk/dialogs/source.c @@ -169,16 +169,16 @@ void nsgtk_source_dialog_init(GtkWindow *parent, struct browser_window *bw) source_data = content_get_source_data(bw->current_content, &source_size); - utf8_convert_ret r = utf8_from_enc( + nserror r = utf8_from_enc( source_data, html_get_encoding(bw->current_content), source_size, &data, &data_len); - if (r == UTF8_CONVERT_NOMEM) { + if (r == NSERROR_NOMEM) { warn_user("NoMemory",0); return; - } else if (r == UTF8_CONVERT_BADENC) { + } else if (r == NSERROR_BAD_ENCODING) { warn_user("EncNotRec",0); return; } @@ -270,7 +270,7 @@ void nsgtk_source_tab_init(GtkWindow *parent, struct browser_window *bw) size_t ndata_len; nsurl *url; nserror error; - utf8_convert_ret r; + nserror r; gchar *filename; char *fileurl; gint handle; @@ -283,10 +283,10 @@ void nsgtk_source_tab_init(GtkWindow *parent, struct browser_window *bw) source_size, &ndata, &ndata_len); - if (r == UTF8_CONVERT_NOMEM) { + if (r == NSERROR_NOMEM) { warn_user("NoMemory",0); return; - } else if (r == UTF8_CONVERT_BADENC) { + } else if (r == NSERROR_BAD_ENCODING) { warn_user("EncNotRec",0); return; } @@ -788,8 +788,7 @@ gboolean nsgtk_ssl_delete_event(GtkWidget *w, GdkEvent *event, gpointer data) return FALSE; } -utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len, - char **result) +nserror utf8_to_local_encoding(const char *string, size_t len, char **result) { assert(string && result); @@ -798,14 +797,13 @@ utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len, *result = strndup(string, len); if (!(*result)) - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; - return UTF8_CONVERT_OK; + return NSERROR_OK; } -utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, - char **result) +nserror utf8_from_local_encoding(const char *string, size_t len, char **result) { assert(string && result); @@ -814,9 +812,9 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, *result = strndup(string, len); if (!(*result)) - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; - return UTF8_CONVERT_OK; + return NSERROR_OK; } diff --git a/monkey/utils.c b/monkey/utils.c index 88776a90f..742c300f1 100644 --- a/monkey/utils.c +++ b/monkey/utils.c @@ -38,20 +38,16 @@ void die(const char * const error) exit(EXIT_FAILURE); } -utf8_convert_ret -utf8_to_local_encoding(const char *string, size_t len, - char **result) +nserror utf8_to_local_encoding(const char *string, size_t len, char **result) { *result = strndup(string, len); - return (*result == NULL) ? UTF8_CONVERT_NOMEM : UTF8_CONVERT_OK; + return (*result == NULL) ? NSERROR_NOMEM : NSERROR_OK; } -utf8_convert_ret -utf8_from_local_encoding(const char *string, size_t len, - char **result) +nserror utf8_from_local_encoding(const char *string, size_t len, char **result) { *result = strndup(string, len); - return (*result == NULL) ? UTF8_CONVERT_NOMEM : UTF8_CONVERT_OK; + return (*result == NULL) ? NSERROR_NOMEM : NSERROR_OK; } diff --git a/render/form.c b/render/form.c index 32c38be4b..c9d74a1c2 100644 --- a/render/form.c +++ b/render/form.c @@ -992,7 +992,7 @@ char *form_acceptable_charset(struct form *form) char *form_encode_item(const char *item, uint32_t len, const char *charset, const char *fallback) { - utf8_convert_ret err; + nserror err; char *ret = NULL; char cset[256]; @@ -1002,19 +1002,19 @@ char *form_encode_item(const char *item, uint32_t len, const char *charset, snprintf(cset, sizeof cset, "%s//TRANSLIT", charset); err = utf8_to_enc(item, cset, 0, &ret); - if (err == UTF8_CONVERT_BADENC) { + if (err == NSERROR_BAD_ENCODING) { /* charset not understood, try without transliteration */ snprintf(cset, sizeof cset, "%s", charset); err = utf8_to_enc(item, cset, len, &ret); - if (err == UTF8_CONVERT_BADENC) { + if (err == NSERROR_BAD_ENCODING) { /* nope, try fallback charset (if any) */ if (fallback) { snprintf(cset, sizeof cset, "%s//TRANSLIT", fallback); err = utf8_to_enc(item, cset, 0, &ret); - if (err == UTF8_CONVERT_BADENC) { + if (err == NSERROR_BAD_ENCODING) { /* and without transliteration */ snprintf(cset, sizeof cset, "%s", fallback); @@ -1022,11 +1022,11 @@ char *form_encode_item(const char *item, uint32_t len, const char *charset, } } - if (err == UTF8_CONVERT_BADENC) { + if (err == NSERROR_BAD_ENCODING) { /* that also failed, use 8859-1 */ err = utf8_to_enc(item, "ISO-8859-1//TRANSLIT", 0, &ret); - if (err == UTF8_CONVERT_BADENC) { + if (err == NSERROR_BAD_ENCODING) { /* and without transliteration */ err = utf8_to_enc(item, "ISO-8859-1", 0, &ret); @@ -1034,7 +1034,7 @@ char *form_encode_item(const char *item, uint32_t len, const char *charset, } } } - if (err == UTF8_CONVERT_NOMEM) { + if (err == NSERROR_NOMEM) { return NULL; } diff --git a/render/html.c b/render/html.c index 0a7ab2453..bd23aaca4 100644 --- a/render/html.c +++ b/render/html.c @@ -1765,14 +1765,14 @@ static void html__dom_user_data_handler(dom_node_operation operation, static void html__set_file_gadget_filename(struct content *c, struct form_control *gadget, const char *fn) { - utf8_convert_ret ret; + nserror ret; char *utf8_fn, *oldfile = NULL; html_content *html = (html_content *)c; struct box *file_box = gadget->box; ret = utf8_from_local_encoding(fn,0, &utf8_fn); - if (ret != UTF8_CONVERT_OK) { - assert(ret != UTF8_CONVERT_BADENC); + if (ret != NSERROR_OK) { + assert(ret != NSERROR_BAD_ENCODING); LOG(("utf8_from_local_encoding failed")); /* Load was for us - just no memory */ return; @@ -1874,7 +1874,7 @@ static bool html_drop_file_at_point(struct content *c, int x, int y, char *file) FILE *fp = NULL; char *buffer; char *utf8_buff; - utf8_convert_ret ret; + nserror ret; unsigned int size; int bx, by; @@ -1916,9 +1916,9 @@ static bool html_drop_file_at_point(struct content *c, int x, int y, char *file) /* Convert to UTF-8 */ ret = utf8_from_local_encoding(buffer, file_len, &utf8_buff); - if (ret != UTF8_CONVERT_OK) { + if (ret != NSERROR_OK) { /* bad encoding shouldn't happen */ - assert(ret != UTF8_CONVERT_BADENC); + assert(ret != NSERROR_BAD_ENCODING); LOG(("utf8_from_local_encoding failed")); free(buffer); warn_user("NoMemory", NULL); diff --git a/riscos/download.c b/riscos/download.c index d0149b66c..526f30174 100644 --- a/riscos/download.c +++ b/riscos/download.c @@ -228,7 +228,7 @@ static struct gui_download_window *gui_download_window_create(download_context * os_error *error; url_func_result res; char *local_path; - utf8_convert_ret err; + nserror err; size_t i, last_dot; dw = malloc(sizeof *dw); @@ -376,9 +376,9 @@ static struct gui_download_window *gui_download_window_create(download_context * filename); err = utf8_to_local_encoding(dw->path, 0, &local_path); - if (err != UTF8_CONVERT_OK) { + if (err != NSERROR_OK) { /* badenc should never happen */ - assert(err != UTF8_CONVERT_BADENC); + assert(err !=NSERROR_BAD_ENCODING); LOG(("utf8_to_local_encoding failed")); warn_user("NoMemory", 0); free(dw); @@ -588,7 +588,7 @@ void ro_gui_download_update_status(struct gui_download_window *dw) os_error *error; int width; char *local_status; - utf8_convert_ret err; + nserror err; gettimeofday(&t, 0); dt = (t.tv_sec + 0.000001 * t.tv_usec) - (dw->last_time.tv_sec + @@ -622,9 +622,9 @@ void ro_gui_download_update_status(struct gui_download_window *dw) /* convert to local encoding */ err = utf8_to_local_encoding( messages_get("Download"), 0, &local_status); - if (err != UTF8_CONVERT_OK) { + if (err != NSERROR_OK) { /* badenc should never happen */ - assert(err != UTF8_CONVERT_BADENC); + assert(err != NSERROR_BAD_ENCODING); /* hide nomem error */ snprintf(dw->status, sizeof dw->status, messages_get("Download"), @@ -645,9 +645,9 @@ void ro_gui_download_update_status(struct gui_download_window *dw) err = utf8_to_local_encoding( messages_get("DownloadU"), 0, &local_status); - if (err != UTF8_CONVERT_OK) { + if (err != NSERROR_OK) { /* badenc should never happen */ - assert(err != UTF8_CONVERT_BADENC); + assert(err != NSERROR_BAD_ENCODING); /* hide nomem error */ snprintf(dw->status, sizeof dw->status, messages_get("DownloadU"), @@ -673,9 +673,9 @@ void ro_gui_download_update_status(struct gui_download_window *dw) err = utf8_to_local_encoding(messages_get("Downloaded"), 0, &local_status); - if (err != UTF8_CONVERT_OK) { + if (err != NSERROR_OK) { /* badenc should never happen */ - assert(err != UTF8_CONVERT_BADENC); + assert(err != NSERROR_BAD_ENCODING); /* hide nomem error */ snprintf(dw->status, sizeof dw->status, messages_get("Downloaded"), diff --git a/riscos/gui/url_bar.c b/riscos/gui/url_bar.c index d7647402b..681824d89 100644 --- a/riscos/gui/url_bar.c +++ b/riscos/gui/url_bar.c @@ -956,12 +956,12 @@ void ro_gui_url_bar_set_url(struct url_bar *url_bar, const char *url, */ if (is_utf8) { - utf8_convert_ret err; + nserror err; err = utf8_to_local_encoding(url, 0, &local_text); - if (err != UTF8_CONVERT_OK) { + if (err != NSERROR_OK) { /* A bad encoding should never happen, so assert this */ - assert(err != UTF8_CONVERT_BADENC); + assert(err != NSERROR_BAD_ENCODING); LOG(("utf8_to_enc failed")); /* Paranoia */ local_text = NULL; diff --git a/riscos/help.c b/riscos/help.c index 14d34af15..9da52f3e6 100644 --- a/riscos/help.c +++ b/riscos/help.c @@ -225,7 +225,7 @@ static void ro_gui_interactive_help_broadcast(wimp_message *message, char *base_token; char *local_token; os_error *error; - utf8_convert_ret err; + nserror err; /* start off with an empty reply */ reply = (help_full_message_reply *)message; @@ -255,9 +255,9 @@ static void ro_gui_interactive_help_broadcast(wimp_message *message, /* convert to local encoding */ err = utf8_to_local_encoding(translated_token, 0, &local_token); - if (err != UTF8_CONVERT_OK) { + if (err != NSERROR_OK) { /* badenc should never happen */ - assert(err != UTF8_CONVERT_BADENC); + assert(err != NSERROR_BAD_ENCODING); /* simply use UTF-8 string */ strncpy(reply->reply, translated_token, 235); } diff --git a/riscos/menus.c b/riscos/menus.c index e51fc34c5..29d514122 100644 --- a/riscos/menus.c +++ b/riscos/menus.c @@ -875,8 +875,7 @@ bool ro_gui_menu_translate(struct menu_definition *menu) int alphabet; struct menu_definition_entry *entry; char *translated; - utf8_convert_ret err; - + nserror err; /* read current alphabet */ error = xosbyte1(osbyte_ALPHABET_NUMBER, 127, 0, &alphabet); @@ -895,8 +894,8 @@ bool ro_gui_menu_translate(struct menu_definition *menu) free(menu->menu->title_data.indirected_text.text); err = utf8_to_local_encoding(messages_get(menu->title_key), 0, &translated); - if (err != UTF8_CONVERT_OK) { - assert(err != UTF8_CONVERT_BADENC); + if (err != NSERROR_OK) { + assert(err != NSERROR_BAD_ENCODING); LOG(("utf8_to_enc failed")); return false; } @@ -912,8 +911,8 @@ bool ro_gui_menu_translate(struct menu_definition *menu) free(entry->menu_entry->data.indirected_text.text); err = utf8_to_local_encoding(messages_get(entry->entry_key), 0, &translated); - if (err != UTF8_CONVERT_OK) { - assert(err != UTF8_CONVERT_BADENC); + if (err != NSERROR_OK) { + assert(err != NSERROR_BAD_ENCODING); LOG(("utf8_to_enc failed")); return false; } diff --git a/riscos/query.c b/riscos/query.c index 6401ad2b8..226849462 100644 --- a/riscos/query.c +++ b/riscos/query.c @@ -150,7 +150,7 @@ query_id query_user_xy(const char *query, const char *detail, int len; int tx; char *local_text = NULL; - utf8_convert_ret err; + nserror err; qw = malloc(sizeof(struct gui_query_window)); if (!qw) { @@ -171,8 +171,8 @@ query_id query_user_xy(const char *query, const char *detail, /* set the text of the 'Yes' button and size accordingly */ err = utf8_to_local_encoding(yes, 0, &local_text); - if (err != UTF8_CONVERT_OK) { - assert(err != UTF8_CONVERT_BADENC); + if (err != NSERROR_OK) { + assert(err != NSERROR_BAD_ENCODING); LOG(("utf8_to_local_encoding_failed")); local_text = NULL; } @@ -201,8 +201,8 @@ query_id query_user_xy(const char *query, const char *detail, /* set the text of the 'No' button and size accordingly */ err = utf8_to_local_encoding(no, 0, &local_text); - if (err != UTF8_CONVERT_OK) { - assert(err != UTF8_CONVERT_BADENC); + if (err != NSERROR_OK) { + assert(err != NSERROR_BAD_ENCODING); LOG(("utf8_to_local_encoding_failed")); local_text = NULL; } diff --git a/riscos/save.c b/riscos/save.c index 59222c49a..cc123444c 100644 --- a/riscos/save.c +++ b/riscos/save.c @@ -614,7 +614,7 @@ static void ro_gui_save_drag_end(wimp_dragged *drag, void *data) os_error *error; char *dp, *ep; char *local_name = NULL; - utf8_convert_ret err; + nserror err; if (dragbox_active) ro_gui_drag_box_cancel(); @@ -651,9 +651,9 @@ static void ro_gui_save_drag_end(wimp_dragged *drag, void *data) /* saving directly from browser window, choose a * name based upon the URL */ err = utf8_to_local_encoding(save_leafname, 0, &local_name); - if (err != UTF8_CONVERT_OK) { + if (err != NSERROR_OK) { /* badenc should never happen */ - assert(err != UTF8_CONVERT_BADENC); + assert(err != NSERROR_BAD_ENCODING); local_name = NULL; } name = local_name ? local_name : save_leafname; @@ -1216,7 +1216,7 @@ void ro_gui_save_set_state(hlcache_handle *h, gui_save_type save_type, const char *name = gui_save_table[save_type].name; bool done = false; char *nice = NULL; - utf8_convert_ret err; + nserror err; char *local_name; size_t i; @@ -1270,9 +1270,9 @@ void ro_gui_save_set_state(hlcache_handle *h, gui_save_type save_type, leaf_buf[leaf_len - 1] = 0; err = utf8_to_local_encoding(name, 0, &local_name); - if (err != UTF8_CONVERT_OK) { + if (err != NSERROR_OK) { /* badenc should never happen */ - assert(err != UTF8_CONVERT_BADENC); + assert(err != NSERROR_BAD_ENCODING); local_name = NULL; } diff --git a/riscos/textselection.c b/riscos/textselection.c index 73b5246e3..c07075475 100644 --- a/riscos/textselection.c +++ b/riscos/textselection.c @@ -391,7 +391,7 @@ bool ro_gui_selection_prepare_paste_dataload( FILE *fp; long size; char *local_cb; - utf8_convert_ret ret; + nserror ret; /* Ignore messages that aren't for us */ if (dataxfer->your_ref == 0 || dataxfer->your_ref != paste_prev_message) @@ -410,7 +410,7 @@ bool ro_gui_selection_prepare_paste_dataload( ret = utf8_from_local_encoding(local_cb, size, &clipboard); - if (ret == UTF8_CONVERT_OK) { + if (ret == NSERROR_OK) { clip_length = strlen(clipboard); } @@ -509,13 +509,13 @@ void ro_gui_selection_data_request(wimp_full_message_data_request *req) bool ro_gui_save_clipboard(const char *path) { char *local_cb; - utf8_convert_ret ret; + nserror ret; os_error *error; assert(clip_length > 0 && clipboard); ret = utf8_to_local_encoding(clipboard, clip_length, &local_cb); - if (ret != UTF8_CONVERT_OK) { + if (ret != NSERROR_OK) { warn_user("SaveError", "Could not convert"); return false; } diff --git a/riscos/ucstables.c b/riscos/ucstables.c index 970caf122..4754bac89 100644 --- a/riscos/ucstables.c +++ b/riscos/ucstables.c @@ -446,17 +446,16 @@ static const struct special { * \param string The string to convert * \param len The length (in bytes) of the string, or 0 * \param result Pointer to location in which to store result - * \return The appropriate utf8_convert_ret value + * \return An nserror code */ -utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len, - char **result) +nserror utf8_to_local_encoding(const char *string, size_t len, char **result) { os_error *error; int alphabet, i; size_t off, prev_off; char *temp, *cur_pos; const char *enc; - utf8_convert_ret err; + nserror err; assert(string); assert(result); @@ -473,7 +472,7 @@ utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len, /* UTF-8 -> simply copy string */ if (alphabet == 111 /* UTF-8 */) { *result = strndup(string, len); - return UTF8_CONVERT_OK; + return NSERROR_OK; } /* get encoding name */ @@ -485,7 +484,7 @@ utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len, /* create output buffer */ *(result) = malloc(len + 1); if (!(*result)) - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; *(*result) = '\0'; prev_off = 0; @@ -508,10 +507,10 @@ utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len, if (off - prev_off > 0) { err = utf8_to_enc(string + prev_off, enc, off - prev_off, &temp); - if (err != UTF8_CONVERT_OK) { - assert(err != UTF8_CONVERT_BADENC); + if (err != NSERROR_OK) { + assert(err != NSERROR_BAD_ENCODING); free(*result); - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; } strcat(cur_pos, temp); @@ -533,10 +532,10 @@ utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len, if (prev_off < len) { err = utf8_to_enc(string + prev_off, enc, len - prev_off, &temp); - if (err != UTF8_CONVERT_OK) { - assert(err != UTF8_CONVERT_BADENC); + if (err != NSERROR_OK) { + assert(err != NSERROR_BAD_ENCODING); free(*result); - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; } strcat(cur_pos, temp); @@ -544,7 +543,7 @@ utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len, free(temp); } - return UTF8_CONVERT_OK; + return NSERROR_OK; } /** @@ -553,10 +552,9 @@ utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len, * \param string The string to convert * \param len The length (in bytes) of the string, or 0 * \param result Pointer to location in which to store result - * \return The appropriate utf8_convert_ret value + * \return An nserror code */ -utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, - char **result) +nserror utf8_from_local_encoding(const char *string, size_t len, char **result) { os_error *error; int alphabet, i, num_specials = 0, result_alloc; @@ -564,7 +562,7 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, size_t off, prev_off, cur_off; char *temp; const char *enc; - utf8_convert_ret err; + nserror err; assert(string && result); @@ -581,10 +579,10 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, if (alphabet == 111 /* UTF-8 */) { temp = strndup(string, len); if (!temp) - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; *result = temp; - return UTF8_CONVERT_OK; + return NSERROR_OK; } /* get encoding name */ @@ -598,7 +596,7 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, *(result) = malloc(result_alloc); if (!(*result)) - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; *(*result) = '\0'; prev_off = 0; @@ -619,11 +617,11 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, if (off - prev_off > 0) { err = utf8_from_enc(string + prev_off, enc, off - prev_off, &temp, NULL); - if (err != UTF8_CONVERT_OK) { - assert(err != UTF8_CONVERT_BADENC); + if (err != NSERROR_OK) { + assert(err != NSERROR_BAD_ENCODING); LOG(("utf8_from_enc failed")); free(*result); - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; } strcat((*result) + cur_off, temp); @@ -647,7 +645,7 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, (3 * SPECIAL_CHUNK_SIZE)); if (!temp) { free(*result); - return UTF8_CONVERT_NOMEM; + return NSERRO_NOMEM; } *result = temp; @@ -661,11 +659,11 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, if (prev_off < len) { err = utf8_from_enc(string + prev_off, enc, len - prev_off, &temp, NULL); - if (err != UTF8_CONVERT_OK) { - assert(err != UTF8_CONVERT_BADENC); + if (err != NSERROR_OK) { + assert(err != NSERROR_BAD_ENCODING); LOG(("utf8_from_enc failed")); free(*result); - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; } strcat((*result) + cur_off, temp); @@ -680,9 +678,9 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, if (!temp) { LOG(("realloc failed")); free(*result); - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; } *result = temp; - return UTF8_CONVERT_OK; + return NSERROR_OK; } diff --git a/riscos/wimp.c b/riscos/wimp.c index 87860ad35..2e488918d 100644 --- a/riscos/wimp.c +++ b/riscos/wimp.c @@ -273,12 +273,12 @@ void ro_gui_set_icon_string(wimp_w w, wimp_i i, const char *text, bool is_utf8) unsigned int button_type; if (is_utf8) { - utf8_convert_ret err; + nserror err; /* convert text to local encoding */ err = utf8_to_local_encoding(text, 0, &local_text); - if (err != UTF8_CONVERT_OK) { + if (err != NSERROR_OK) { /* A bad encoding should never happen, so assert this */ - assert(err != UTF8_CONVERT_BADENC); + assert(err != NSERROR_BAD_ENCODING); LOG(("utf8_to_enc failed")); /* Paranoia */ local_text = NULL; @@ -677,7 +677,7 @@ void ro_gui_set_window_title(wimp_w w, const char *text) wimp_window_info_base window; os_error *error; char *title_local_enc; - utf8_convert_ret err; + nserror err; /* Get the window details */ @@ -692,10 +692,10 @@ void ro_gui_set_window_title(wimp_w w, const char *text) /* convert text to local encoding */ err = utf8_to_local_encoding(text, 0, &title_local_enc); - if (err != UTF8_CONVERT_OK) { + if (err != NSERROR_OK) { /* A bad encoding should never happen, * so assert this */ - assert(err != UTF8_CONVERT_BADENC); + assert(err != NSERROR_BAD_ENCODING); LOG(("utf8_to_enc failed")); return; } diff --git a/riscos/window.c b/riscos/window.c index 2221425c3..1f70d3d66 100644 --- a/riscos/window.c +++ b/riscos/window.c @@ -4621,7 +4621,7 @@ bool ro_gui_window_import_text(struct gui_window *g, const char *filename) os_error *error; char *buf, *utf8_buf, *sp; int size; - utf8_convert_ret ret; + nserror ret; const char *ep; char *p; @@ -4656,9 +4656,9 @@ bool ro_gui_window_import_text(struct gui_window *g, const char *filename) } ret = utf8_from_local_encoding(buf, size, &utf8_buf); - if (ret != UTF8_CONVERT_OK) { + if (ret != NSERROR_OK) { /* bad encoding shouldn't happen */ - assert(ret != UTF8_CONVERT_BADENC); + assert(ret != NSERROR_BAD_ENCODING); LOG(("utf8_from_local_encoding failed")); free(buf); warn_user("NoMemory", NULL); @@ -4802,7 +4802,7 @@ bool ro_gui_window_prepare_form_select_menu(struct browser_window *bw, char *text_convert, *temp; struct form_option *option; bool reopen = true; - utf8_convert_ret err; + nserror err; assert(control); @@ -4839,9 +4839,9 @@ bool ro_gui_window_prepare_form_select_menu(struct browser_window *bw, } err = utf8_to_local_encoding(messages_get("SelectMenu"), 0, &text_convert); - if (err != UTF8_CONVERT_OK) { + if (err != NSERROR_OK) { /* badenc should never happen */ - assert(err != UTF8_CONVERT_BADENC); + assert(err != NSERROR_BAD_ENCODING); LOG(("utf8_to_local_encoding failed")); warn_user("NoMemory", 0); ro_gui_menu_closed(); @@ -4875,10 +4875,10 @@ bool ro_gui_window_prepare_form_select_menu(struct browser_window *bw, err = utf8_to_local_encoding(temp, 0, &text_convert); - if (err != UTF8_CONVERT_OK) { + if (err != NSERROR_OK) { /* A bad encoding should never happen, * so assert this */ - assert(err != UTF8_CONVERT_BADENC); + assert(err != NSERROR_BAD_ENCODING); LOG(("utf8_to_enc failed")); warn_user("NoMemory", 0); ro_gui_menu_closed(); diff --git a/utils/utf8.c b/utils/utf8.c index 8e9587d20..ab7bbae06 100644 --- a/utils/utf8.c +++ b/utils/utf8.c @@ -33,23 +33,14 @@ #include "utils/log.h" #include "utils/utf8.h" -/** - * Convert a UTF-8 multibyte sequence into a single UCS4 character - * - * Encoding of UCS values outside the UTF-16 plane has been removed from - * RFC3629. This function conforms to RFC2279, however. - * - * \param s_in The sequence to process - * \param l Length of sequence - * \return UCS4 character - */ +/* exported interface documented in utils/utf8.h */ uint32_t utf8_to_ucs4(const char *s_in, size_t l) { uint32_t ucs4; size_t len; parserutils_error perror; - perror = parserutils_charset_utf8_to_ucs4((const uint8_t *) s_in, l, + perror = parserutils_charset_utf8_to_ucs4((const uint8_t *) s_in, l, &ucs4, &len); if (perror != PARSERUTILS_OK) ucs4 = 0xfffd; @@ -57,16 +48,7 @@ uint32_t utf8_to_ucs4(const char *s_in, size_t l) return ucs4; } -/** - * Convert a single UCS4 character into a UTF-8 multibyte sequence - * - * Encoding of UCS values outside the UTF-16 plane has been removed from - * RFC3629. This function conforms to RFC2279, however. - * - * \param c The character to process (0 <= c <= 0x7FFFFFFF) - * \param s Pointer to 6 byte long output buffer - * \return Length of multibyte sequence - */ +/* exported interface documented in utils/utf8.h */ size_t utf8_from_ucs4(uint32_t c, char *s) { uint8_t *in = (uint8_t *) s; @@ -84,24 +66,13 @@ size_t utf8_from_ucs4(uint32_t c, char *s) return 6 - len; } -/** - * Calculate the length (in characters) of a NULL-terminated UTF-8 string - * - * \param s The string - * \return Length of string - */ +/* exported interface documented in utils/utf8.h */ size_t utf8_length(const char *s) { return utf8_bounded_length(s, strlen(s)); } -/** - * Calculated the length (in characters) of a bounded UTF-8 string - * - * \param s The string - * \param l Maximum length of input (in bytes) - * \return Length of string, in characters - */ +/* exported interface documented in utils/utf8.h */ size_t utf8_bounded_length(const char *s, size_t l) { size_t len; @@ -114,14 +85,7 @@ size_t utf8_bounded_length(const char *s, size_t l) return len; } -/** - * Calculate the length (in bytes) of a bounded UTF-8 string - * - * \param s The string - * \param l Maximum length of input (in bytes) - * \param c Maximum number of characters to measure - * \return Length of string, in bytes - */ +/* exported interface documented in utils/utf8.h */ size_t utf8_bounded_byte_length(const char *s, size_t l, size_t c) { size_t len = 0; @@ -132,12 +96,7 @@ size_t utf8_bounded_byte_length(const char *s, size_t l, size_t c) return len; } -/** - * Calculate the length (in bytes) of a UTF-8 character - * - * \param s Pointer to start of character - * \return Length of character, in bytes - */ +/* exported interface documented in utils/utf8.h */ size_t utf8_char_byte_length(const char *s) { size_t len; @@ -150,13 +109,7 @@ size_t utf8_char_byte_length(const char *s) return len; } -/** - * Find previous legal UTF-8 char in string - * - * \param s The string - * \param o Offset in the string to start at - * \return Offset of first byte of previous legal character - */ +/* exported interface documented in utils/utf8.h */ size_t utf8_prev(const char *s, size_t o) { uint32_t prev; @@ -168,20 +121,13 @@ size_t utf8_prev(const char *s, size_t o) return prev; } -/** - * Find next legal UTF-8 char in string - * - * \param s The string - * \param l Maximum offset in string - * \param o Offset in the string to start at - * \return Offset of first byte of next legal character - */ +/* exported interface documented in utils/utf8.h */ size_t utf8_next(const char *s, size_t l, size_t o) { uint32_t next; parserutils_error perror; - perror = parserutils_charset_utf8_next((const uint8_t *) s, l, o, + perror = parserutils_charset_utf8_next((const uint8_t *) s, l, o, &next); assert(perror == PARSERUTILS_OK); @@ -202,16 +148,16 @@ static inline void utf8_clear_cd_cache(void) last_cd.cd = 0; } -/** - * Finalise the UTF-8 library - */ -void utf8_finalise(void) +/* exported interface documented in utils/utf8.h */ +nserror utf8_finalise(void) { if (last_cd.cd != 0) iconv_close(last_cd.cd); /* paranoia follows */ utf8_clear_cd_cache(); + + return NSERROR_OK; } @@ -224,11 +170,16 @@ void utf8_finalise(void) * \param to The encoding name to convert to * \param result Pointer to location in which to store result. * \param result_len Pointer to location in which to store result length. - * \return Appropriate utf8_convert_ret value + * \return NSERROR_OK for no error, NSERROR_NOMEM on allocation error, + * NSERROR_BAD_ENCODING for a bad character encoding */ -static utf8_convert_ret utf8_convert(const char *string, size_t len, - const char *from, const char *to, - char **result, size_t *result_len) +static nserror +utf8_convert(const char *string, + size_t len, + const char *from, + const char *to, + char **result, + size_t *result_len) { iconv_t cd; char *temp, *out, *in; @@ -237,16 +188,16 @@ static utf8_convert_ret utf8_convert(const char *string, size_t len, assert(string && from && to && result); if (string[0] == '\0') { - /* On AmigaOS, iconv() returns an error if we pass an - * empty string. This prevents iconv() being called as + /* On AmigaOS, iconv() returns an error if we pass an + * empty string. This prevents iconv() being called as * there is no conversion necessary anyway. */ *result = strdup(""); if (!(*result)) { *result = NULL; - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; } - return UTF8_CONVERT_OK; + return NSERROR_OK; } if (strcasecmp(from, to) == 0) { @@ -255,10 +206,10 @@ static utf8_convert_ret utf8_convert(const char *string, size_t len, *(result) = strndup(string, slen); if (!(*result)) { *(result) = NULL; - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; } - return UTF8_CONVERT_OK; + return NSERROR_OK; } in = (char *)string; @@ -274,9 +225,9 @@ static utf8_convert_ret utf8_convert(const char *string, size_t len, cd = iconv_open(to, from); if (cd == (iconv_t)-1) { if (errno == EINVAL) - return UTF8_CONVERT_BADENC; + return NSERROR_BAD_ENCODING; /* default to no memory */ - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; } /* close the last cd - we don't care if this fails */ @@ -297,8 +248,9 @@ static utf8_convert_ret utf8_convert(const char *string, size_t len, rlen = slen * 4 + 4; temp = out = malloc(rlen); - if (!out) - return UTF8_CONVERT_NOMEM; + if (!out) { + return NSERROR_NOMEM; + } /* perform conversion */ if (iconv(cd, (void *) &in, &slen, &out, &rlen) == (size_t)-1) { @@ -312,14 +264,14 @@ static utf8_convert_ret utf8_convert(const char *string, size_t len, * a) Insufficiently large output buffer * b) Invalid input byte sequence * c) Incomplete input sequence */ - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; } *(result) = realloc(temp, out - temp + 4); if (!(*result)) { free(temp); *(result) = NULL; /* for sanity's sake */ - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; } /* NULL terminate - needs 4 characters as we may have @@ -330,42 +282,32 @@ static utf8_convert_ret utf8_convert(const char *string, size_t len, *result_len = (out - temp); } - return UTF8_CONVERT_OK; + return NSERROR_OK; } -/** - * Convert a UTF8 string into the named encoding - * - * \param string The NULL-terminated string to convert - * \param encname The encoding name (suitable for passing to iconv) - * \param len Length of input string to consider (in bytes), or 0 - * \param result Pointer to location to store result (allocated on heap) - * \return Appropriate utf8_convert_ret value - */ -utf8_convert_ret utf8_to_enc(const char *string, const char *encname, +/* exported interface documented in utils/utf8.h */ +nserror utf8_to_enc(const char *string, const char *encname, size_t len, char **result) { return utf8_convert(string, len, "UTF-8", encname, result, NULL); } -/** - * Convert a string in the named encoding into a UTF-8 string - * - * \param string The NULL-terminated string to convert - * \param encname The encoding name (suitable for passing to iconv) - * \param len Length of input string to consider (in bytes), or 0 - * \param result Pointer to location to store result (allocated on heap) - * \return Appropriate utf8_convert_ret value - */ -utf8_convert_ret utf8_from_enc(const char *string, const char *encname, +/* exported interface documented in utils/utf8.h */ +nserror utf8_from_enc(const char *string, const char *encname, size_t len, char **result, size_t *result_len) { return utf8_convert(string, len, encname, "UTF-8", result, result_len); } -static utf8_convert_ret utf8_convert_html_chunk(iconv_t cd, - const char *chunk, size_t inlen, - char **out, size_t *outlen) +/** + * convert a chunk of html data + */ +static nserror +utf8_convert_html_chunk(iconv_t cd, + const char *chunk, + size_t inlen, + char **out, + size_t *outlen) { size_t ret, esclen; uint32_t ucs4; @@ -377,7 +319,7 @@ static utf8_convert_ret utf8_convert_html_chunk(iconv_t cd, break; if (errno != EILSEQ) - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; ucs4 = utf8_to_ucs4(chunk, inlen); esclen = snprintf(escape, sizeof(escape), "&#x%06x;", ucs4); @@ -385,34 +327,25 @@ static utf8_convert_ret utf8_convert_html_chunk(iconv_t cd, ret = iconv(cd, (void *) &pescape, &esclen, (void *) out, outlen); if (ret == (size_t) -1) - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; esclen = utf8_next(chunk, inlen, 0); chunk += esclen; inlen -= esclen; } - return UTF8_CONVERT_OK; + return NSERROR_OK; } -/** - * Convert a UTF-8 encoded string into a string of the given encoding, - * applying HTML escape sequences where necessary. - * - * \param string String to convert (NUL-terminated) - * \param encname Name of encoding to convert to - * \param len Length, in bytes, of the input string, or 0 - * \param result Pointer to location to receive result - * \return Appropriate utf8_convert_ret value - */ -utf8_convert_ret utf8_to_html(const char *string, const char *encname, - size_t len, char **result) +/* exported interface documented in utils/utf8.h */ +nserror +utf8_to_html(const char *string, const char *encname, size_t len, char **result) { iconv_t cd; const char *in; char *out, *origout; size_t off, prev_off, inlen, outlen, origoutlen, esclen; - utf8_convert_ret ret; + nserror ret; char *pescape, escape[11]; if (len == 0) @@ -425,15 +358,14 @@ utf8_convert_ret utf8_to_html(const char *string, const char *encname, sizeof(last_cd.to)) == 0 && last_cd.cd != 0) { cd = last_cd.cd; - } - else { + } else { /* no match, so create a new cd */ cd = iconv_open(encname, "UTF-8"); if (cd == (iconv_t) -1) { if (errno == EINVAL) - return UTF8_CONVERT_BADENC; + return NSERROR_BAD_ENCODING; /* default to no memory */ - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; } /* close the last cd - we don't care if this fails */ @@ -446,8 +378,8 @@ utf8_convert_ret utf8_to_html(const char *string, const char *encname, last_cd.cd = cd; } - /* Worst case is ASCII -> UCS4, with all characters escaped: - * "&#xYYYYYY;", thus each input character may become a string + /* Worst case is ASCII -> UCS4, with all characters escaped: + * "&#xYYYYYY;", thus each input character may become a string * of 10 UCS4 characters, each 4 bytes in length, plus four for * terminating the string */ origoutlen = outlen = len * 10 * 4 + 4; @@ -455,7 +387,7 @@ utf8_convert_ret utf8_to_html(const char *string, const char *encname, if (out == NULL) { iconv_close(cd); utf8_clear_cd_cache(); - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; } /* Process input in chunks between characters we must escape */ @@ -470,7 +402,7 @@ utf8_convert_ret utf8_to_html(const char *string, const char *encname, inlen = off - prev_off; ret = utf8_convert_html_chunk(cd, in, inlen, &out, &outlen); - if (ret != UTF8_CONVERT_OK) { + if (ret != NSERROR_OK) { free(origout); iconv_close(cd); utf8_clear_cd_cache(); @@ -484,7 +416,7 @@ utf8_convert_ret utf8_to_html(const char *string, const char *encname, pescape = escape; ret = utf8_convert_html_chunk(cd, pescape, esclen, &out, &outlen); - if (ret != UTF8_CONVERT_OK) { + if (ret != NSERROR_OK) { free(origout); iconv_close(cd); utf8_clear_cd_cache(); @@ -502,7 +434,7 @@ utf8_convert_ret utf8_to_html(const char *string, const char *encname, in = string + prev_off; inlen = len - prev_off; ret = utf8_convert_html_chunk(cd, in, inlen, &out, &outlen); - if (ret != UTF8_CONVERT_OK) { + if (ret != NSERROR_OK) { free(origout); iconv_close(cd); utf8_clear_cd_cache(); @@ -518,30 +450,22 @@ utf8_convert_ret utf8_to_html(const char *string, const char *encname, *result = realloc(origout, origoutlen - outlen); if (*result == NULL) { free(origout); - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; } - return UTF8_CONVERT_OK; + return NSERROR_OK; } - -/** - * Save the given utf8 text to a file, converting to local encoding. - * - * \param utf8_text text to save to file - * \param path pathname to save to - * \return true iff the save succeeded - */ - +/* exported interface documented in utils/utf8.h */ bool utf8_save_text(const char *utf8_text, const char *path) { - utf8_convert_ret ret; + nserror ret; char *conv; FILE *out; ret = utf8_to_local_encoding(utf8_text, strlen(utf8_text), &conv); - if (ret != UTF8_CONVERT_OK) { + if (ret != NSERROR_OK) { LOG(("failed to convert to local encoding, return %d", ret)); return false; } @@ -562,5 +486,3 @@ bool utf8_save_text(const char *utf8_text, const char *path) return false; } - - diff --git a/utils/utf8.h b/utils/utf8.h index 68d42d3ea..7c450b5c3 100644 --- a/utils/utf8.h +++ b/utils/utf8.h @@ -26,40 +26,144 @@ #include <stdbool.h> #include <stdint.h> -typedef enum { - UTF8_CONVERT_OK, - UTF8_CONVERT_NOMEM, - UTF8_CONVERT_BADENC -} utf8_convert_ret; +#include "utils/errors.h" +/** + * Convert a UTF-8 multibyte sequence into a single UCS4 character + * + * Encoding of UCS values outside the UTF-16 plane has been removed from + * RFC3629. This function conforms to RFC2279, however. + * + * \param s_in The sequence to process + * \param l Length of sequence + * \return UCS4 character + */ uint32_t utf8_to_ucs4(const char *s, size_t l); + +/** + * Convert a single UCS4 character into a UTF-8 multibyte sequence + * + * Encoding of UCS values outside the UTF-16 plane has been removed from + * RFC3629. This function conforms to RFC2279, however. + * + * \param c The character to process (0 <= c <= 0x7FFFFFFF) + * \param s Pointer to 6 byte long output buffer + * \return Length of multibyte sequence + */ size_t utf8_from_ucs4(uint32_t c, char *s); + +/** + * Calculate the length (in characters) of a NULL-terminated UTF-8 string + * + * \param s The string + * \return Length of string + */ size_t utf8_length(const char *s); + +/** + * Calculated the length (in characters) of a bounded UTF-8 string + * + * \param s The string + * \param l Maximum length of input (in bytes) + * \return Length of string, in characters + */ size_t utf8_bounded_length(const char *s, size_t l); + +/** + * Calculate the length (in bytes) of a bounded UTF-8 string + * + * \param s The string + * \param l Maximum length of input (in bytes) + * \param c Maximum number of characters to measure + * \return Length of string, in bytes + */ size_t utf8_bounded_byte_length(const char *s, size_t l, size_t c); +/** + * Calculate the length (in bytes) of a UTF-8 character + * + * \param s Pointer to start of character + * \return Length of character, in bytes + */ size_t utf8_char_byte_length(const char *s); + +/** + * Find previous legal UTF-8 char in string + * + * \param s The string + * \param o Offset in the string to start at + * \return Offset of first byte of previous legal character + */ size_t utf8_prev(const char *s, size_t o); + +/** + * Find next legal UTF-8 char in string + * + * \param s The string + * \param l Maximum offset in string + * \param o Offset in the string to start at + * \return Offset of first byte of next legal character + */ size_t utf8_next(const char *s, size_t l, size_t o); -utf8_convert_ret utf8_to_enc(const char *string, const char *encname, + +/** + * Convert a UTF8 string into the named encoding + * + * \param string The NULL-terminated string to convert + * \param encname The encoding name (suitable for passing to iconv) + * \param len Length of input string to consider (in bytes), or 0 + * \param result Pointer to location to store result (allocated on heap) + * \return standard nserror value + */ +nserror utf8_to_enc(const char *string, const char *encname, size_t len, char **result); -utf8_convert_ret utf8_from_enc(const char *string, const char *encname, + +/** + * Convert a string in the named encoding into a UTF-8 string + * + * \param string The NULL-terminated string to convert + * \param encname The encoding name (suitable for passing to iconv) + * \param len Length of input string to consider (in bytes), or 0 + * \param result Pointer to location to store result (allocated on heap) + * \return standard nserror value + */ +nserror utf8_from_enc(const char *string, const char *encname, size_t len, char **result, size_t *result_len); -utf8_convert_ret utf8_to_html(const char *string, const char *encname, +/** + * Convert a UTF-8 encoded string into a string of the given encoding, + * applying HTML escape sequences where necessary. + * + * \param string String to convert (NUL-terminated) + * \param encname Name of encoding to convert to + * \param len Length, in bytes, of the input string, or 0 + * \param result Pointer to location to receive result + * \return standard nserror code + */ +nserror utf8_to_html(const char *string, const char *encname, size_t len, char **result); +/** + * Save the given utf8 text to a file, converting to local encoding. + * + * \param utf8_text text to save to file + * \param path pathname to save to + * \return true iff the save succeeded + */ bool utf8_save_text(const char *utf8_text, const char *path); + +/** + * Finalise the UTF-8 library + */ +nserror utf8_finalise(void); + /* These two are platform specific */ -utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len, - char **result); -utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, - char **result); +nserror utf8_to_local_encoding(const char *string, size_t len, char **result); +nserror utf8_from_local_encoding(const char *string, size_t len, char **result); -void utf8_finalise(void); #endif diff --git a/windows/font.c b/windows/font.c index c99cec7cf..98269a35f 100644 --- a/windows/font.c +++ b/windows/font.c @@ -35,7 +35,7 @@ #include "windows/gui.h" #include "windows/plot.h" -utf8_convert_ret utf8_to_font_encoding(const struct font_desc* font, +nserror utf8_to_font_encoding(const struct font_desc* font, const char *string, size_t len, char **result) @@ -43,14 +43,14 @@ utf8_convert_ret utf8_to_font_encoding(const struct font_desc* font, return utf8_to_enc(string, font->encoding, len, result); } -utf8_convert_ret utf8_to_local_encoding(const char *string, +nserror utf8_to_local_encoding(const char *string, size_t len, char **result) { return utf8_to_enc(string, "UCS-2", len, result); } -utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, +nserror utf8_from_local_encoding(const char *string, size_t len, char **result) { assert(string && result); @@ -60,9 +60,9 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len, *result = strndup(string, len); if (!(*result)) - return UTF8_CONVERT_NOMEM; + return NSERROR_NOMEM; - return UTF8_CONVERT_OK; + return NSERROR_OK; } HFONT get_font(const plot_font_style_t *style) diff --git a/windows/font.h b/windows/font.h index 4bd100f6a..45428fede 100644 --- a/windows/font.h +++ b/windows/font.h @@ -29,7 +29,7 @@ struct font_desc { const char *encoding; }; -extern utf8_convert_ret utf8_to_font_encoding(const struct font_desc* font, +extern nserror utf8_to_font_encoding(const struct font_desc* font, const char *string, size_t len, char **result); |