From a84f11d6bd217de89e73b1880546a3af48cfd9c8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 17 Dec 2002 21:46:44 +0000 Subject: Replace calls to g_string_sprintfa() with g_string_append_printf() since 2002-12-17 Jeffrey Stedfast * providers/imap/camel-imap-utils.c: Replace calls to g_string_sprintfa() with g_string_append_printf() since the former seems to have been deprecated. * providers/imap/camel-imap-search.c: Same. * providers/imap/camel-imap-folder.c: Here too. * providers/local/camel-mbox-summary.c: And here. * providers/local/camel-local-summary.c: Replace g_string_sprintf() with g_string_printf(). * camel-data-cache.c (data_cache_expire): Replace g_string_sprintf() with g_string_printf(). * camel-url.c: Replace calls to g_string_sprintfa() with g_string_append_printf() since the former seems to have been deprecated. * camel-service.c: Same. * camel-mime-utils.c: Here too. svn path=/trunk/; revision=19154 --- camel/providers/imap/Makefile.am | 3 +- camel/providers/imap/camel-imap-folder.c | 9 +++--- camel/providers/imap/camel-imap-search.c | 36 ++++++++++++------------ camel/providers/imap/camel-imap-utils.c | 29 +++++++++---------- camel/providers/local/Makefile.am | 3 +- camel/providers/local/camel-local-folder.c | 10 +++---- camel/providers/local/camel-local-provider.c | 6 ++-- camel/providers/local/camel-local-store.c | 6 ++-- camel/providers/local/camel-local-summary.c | 40 ++++++++++++++------------- camel/providers/local/camel-maildir-summary.c | 14 +++++----- camel/providers/local/camel-mbox-summary.c | 20 ++++++++------ camel/providers/local/camel-mh-store.c | 16 +++++------ camel/providers/local/camel-spool-store.c | 4 +-- camel/providers/local/camel-spool-summary.c | 12 ++++---- camel/providers/nntp/Makefile.am | 3 +- camel/providers/pop3/Makefile.am | 3 +- camel/providers/sendmail/Makefile.am | 23 +++++++-------- 17 files changed, 122 insertions(+), 115 deletions(-) (limited to 'camel/providers') diff --git a/camel/providers/imap/Makefile.am b/camel/providers/imap/Makefile.am index 469964a9a6..b2f6014349 100644 --- a/camel/providers/imap/Makefile.am +++ b/camel/providers/imap/Makefile.am @@ -15,7 +15,8 @@ INCLUDES = -I.. \ $(CAMEL_CFLAGS) \ $(GNOME_INCLUDEDIR) \ $(GTK_INCLUDEDIR) \ - -DG_LOG_DOMAIN=\"camel-imap-provider\" + -DG_LOG_DOMAIN=\"camel-imap-provider\" \ + -DG_DISABLE_DEPRECATED libcamelimap_la_SOURCES = \ camel-imap-command.c \ diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c index e95904027a..e63dc73726 100644 --- a/camel/providers/imap/camel-imap-folder.c +++ b/camel/providers/imap/camel-imap-folder.c @@ -23,6 +23,7 @@ * USA */ + #ifdef HAVE_CONFIG_H #include #endif @@ -689,7 +690,7 @@ get_matching (CamelFolder *folder, guint32 flags, guint32 mask, char **set) if (range != -1) { if (range != i - 1) { info = matches->pdata[matches->len - 1]; - g_string_sprintfa (gset, ":%s", camel_message_info_uid (info)); + g_string_append_printf (gset, ":%s", camel_message_info_uid (info)); } range = -1; } @@ -702,12 +703,12 @@ get_matching (CamelFolder *folder, guint32 flags, guint32 mask, char **set) range = i; if (gset->len) g_string_append_c (gset, ','); - g_string_sprintfa (gset, "%s", camel_message_info_uid (info)); + g_string_append_printf (gset, "%s", camel_message_info_uid (info)); } if (range != -1 && range != max - 1) { info = matches->pdata[matches->len - 1]; - g_string_sprintfa (gset, ":%s", camel_message_info_uid (info)); + g_string_append_printf (gset, ":%s", camel_message_info_uid (info)); } if (matches->len) { @@ -1720,7 +1721,7 @@ get_content (CamelImapFolder *imap_folder, const char *uid, /* we assume that part->content_type is more accurate/full than ci->type */ camel_data_wrapper_set_mime_type_field (CAMEL_DATA_WRAPPER (body_mp), part->content_type); - spec = alloca (strlen (part_spec) + 6); + spec = g_alloca (strlen (part_spec) + 6); sprintf (spec, part_spec[0] ? "%s.TEXT" : "TEXT", part_spec); g_free (part_spec); diff --git a/camel/providers/imap/camel-imap-search.c b/camel/providers/imap/camel-imap-search.c index c30fa5611e..9fd59b2cd7 100644 --- a/camel/providers/imap/camel-imap-search.c +++ b/camel/providers/imap/camel-imap-search.c @@ -312,35 +312,35 @@ sync_match(CamelImapSearch *is, struct _match_record *mr) struct _camel_search_words *words; GString *search; int i; - + if (mr->lastuid >= is->lastuid && mr->validity == is->validity) return 0; - - d(printf("updating match record for uid's %d:%d\n", mr->lastuid+1, is->lastuid)); - + + d(printf ("updating match record for uid's %d:%d\n", mr->lastuid+1, is->lastuid)); + /* TODO: Handle multiple search terms */ - + /* This handles multiple search words within a single term */ - words = camel_search_words_split(mr->terms[0]); - search = g_string_new(""); - g_string_sprintfa(search, "UID %d:%d", mr->lastuid+1, is->lastuid); - for (i=0;ilen;i++) { + words = camel_search_words_split (mr->terms[0]); + search = g_string_new (""); + g_string_append_printf (search, "UID %d:%d", mr->lastuid + 1, is->lastuid); + for (i = 0; i < words->len; i++) { char *w = words->words[i]->word, c; - - g_string_sprintfa(search, " BODY \""); + + g_string_append_printf (search, " BODY \""); while ((c = *w++)) { if (c == '\\' || c == '"') - g_string_append_c(search, '\\'); - g_string_append_c(search, c); + g_string_append_c (search, '\\'); + g_string_append_c (search, c); } - g_string_append_c(search, '"'); + g_string_append_c (search, '"'); } - camel_search_words_free(words); - + camel_search_words_free (words); + /* We only try search using utf8 if its non us-ascii text? */ if ((words->type & CAMEL_SEARCH_WORD_8BIT) && (store->capabilities & IMAP_CAPABILITY_utf8_search)) { - response = camel_imap_command(store, folder, NULL, - "UID SEARCH CHARSET UTF-8 %s", search->str); + response = camel_imap_command (store, folder, NULL, + "UID SEARCH CHARSET UTF-8 %s", search->str); /* We can't actually tell if we got a NO response, so assume always */ if (response == NULL) store->capabilities &= ~IMAP_CAPABILITY_utf8_search; diff --git a/camel/providers/imap/camel-imap-utils.c b/camel/providers/imap/camel-imap-utils.c index fc507398db..bb8fdef00a 100644 --- a/camel/providers/imap/camel-imap-utils.c +++ b/camel/providers/imap/camel-imap-utils.c @@ -20,6 +20,7 @@ * */ + #ifdef HAVE_CONFIG_H #include #endif @@ -30,10 +31,6 @@ #include #include -#ifdef HAVE_ALLOCA_H -#include -#endif - #include "camel-imap-utils.h" #include "camel-imap-summary.h" #include "camel-imap-store.h" @@ -1010,17 +1007,17 @@ imap_uid_array_to_set (CamelFolderSummary *summary, GPtrArray *uids, int uid, ss range = TRUE; else { if (range) { - g_string_sprintfa (gset, ":%lu", last_uid); + g_string_append_printf (gset, ":%lu", last_uid); range = FALSE; } - g_string_sprintfa (gset, ",%lu", this_uid); + g_string_append_printf (gset, ",%lu", this_uid); } last_uid = this_uid; } if (range) - g_string_sprintfa (gset, ":%lu", last_uid); + g_string_append_printf (gset, ":%lu", last_uid); *lastuid = uid; @@ -1136,21 +1133,21 @@ imap_mailbox_encode (const unsigned char *in, size_t inlen) { char *buf; - buf = alloca(inlen+1); - memcpy(buf, in, inlen); + buf = g_alloca (inlen + 1); + memcpy (buf, in, inlen); buf[inlen] = 0; - - return camel_utf8_utf7(buf); + + return camel_utf8_utf7 (buf); } char * imap_mailbox_decode (const unsigned char *in, size_t inlen) { char *buf; - - buf = alloca(inlen+1); - memcpy(buf, in, inlen); + + buf = g_alloca (inlen + 1); + memcpy (buf, in, inlen); buf[inlen] = 0; - - return camel_utf7_utf8(buf); + + return camel_utf7_utf8 (buf); } diff --git a/camel/providers/local/Makefile.am b/camel/providers/local/Makefile.am index 05e2d171fc..f01cb7ba4f 100644 --- a/camel/providers/local/Makefile.am +++ b/camel/providers/local/Makefile.am @@ -15,7 +15,8 @@ INCLUDES = -I.. \ $(CAMEL_CFLAGS) \ $(GNOME_INCLUDEDIR) \ $(GTK_INCLUDEDIR) \ - -DG_LOG_DOMAIN=\"camel-local-provider\" + -DG_LOG_DOMAIN=\"camel-local-provider\" \ + -DG_DISABLE_DEPRECATED libcamellocal_la_SOURCES = \ camel-local-folder.c \ diff --git a/camel/providers/local/camel-local-folder.c b/camel/providers/local/camel-local-folder.c index 8fd0a23e2f..c93f8b18c7 100644 --- a/camel/providers/local/camel-local-folder.c +++ b/camel/providers/local/camel-local-folder.c @@ -208,9 +208,9 @@ camel_local_folder_construct(CamelLocalFolder *lf, CamelStore *parent_store, con root_dir_path = camel_local_store_get_toplevel_dir(CAMEL_LOCAL_STORE(folder->parent_store)); /* strip the trailing '/' which is always present */ - len = strlen(root_dir_path); - tmp = alloca(len+1); - strcpy(tmp, root_dir_path); + len = strlen (root_dir_path); + tmp = g_alloca (len + 1); + strcpy (tmp, root_dir_path); if (len>1 && tmp[len-1] == '/') tmp[len-1] = 0; @@ -344,8 +344,8 @@ local_getv(CamelObject *object, CamelException *ex, CamelArgGetV *args) if (tmp == NULL) goto skip; - path = alloca(strlen(tmp)+strlen(folder->full_name)+1); - sprintf(path, "%s/%s", tmp, folder->full_name); + path = g_alloca (strlen (tmp) + strlen (folder->full_name) + 1); + sprintf (path, "%s/%s", tmp, folder->full_name); if ((tmp = getenv("HOME")) && strncmp(tmp, path, strlen(tmp)) == 0) /* $HOME relative path + protocol string */ diff --git a/camel/providers/local/camel-local-provider.c b/camel/providers/local/camel-local-provider.c index 28158a55c1..077bc45b5f 100644 --- a/camel/providers/local/camel-local-provider.c +++ b/camel/providers/local/camel-local-provider.c @@ -133,16 +133,16 @@ make_can_path(char *p, char *o) } /* 'helper' function for it */ -#define get_can_path(p) ((p==NULL)?NULL:(make_can_path((p), alloca(strlen(p)+1)))) +#define get_can_path(p) ((p == NULL) ? NULL : (make_can_path ((p), g_alloca (strlen (p) + 1)))) static guint local_url_hash (const void *v) { const CamelURL *u = v; guint hash = 0; - + #define ADD_HASH(s) if (s) hash ^= g_str_hash (s); - + ADD_HASH (u->protocol); ADD_HASH (u->user); ADD_HASH (u->authmech); diff --git a/camel/providers/local/camel-local-store.c b/camel/providers/local/camel-local-store.c index a794b778f3..18226d968c 100644 --- a/camel/providers/local/camel-local-store.c +++ b/camel/providers/local/camel-local-store.c @@ -158,11 +158,11 @@ get_folder(CamelStore * store, const char *folder_name, guint32 flags, CamelExce } /* need to create the dir heirarchy */ - sub = alloca(strlen(path)+1); - strcpy(sub, path); + sub = g_alloca (strlen (path) + 1); + strcpy (sub, path); slash = sub; do { - slash = strchr(slash+1, '/'); + slash = strchr (slash + 1, '/'); if (slash) *slash = 0; if (stat (sub, &st) == -1) { diff --git a/camel/providers/local/camel-local-summary.c b/camel/providers/local/camel-local-summary.c index 4e83224cfe..807b04e4b0 100644 --- a/camel/providers/local/camel-local-summary.c +++ b/camel/providers/local/camel-local-summary.c @@ -453,7 +453,8 @@ local_summary_add(CamelLocalSummary *cls, CamelMimeMessage *msg, const CamelMess camel_folder_change_info_add_uid(ci, camel_message_info_uid(mi)); } else { d(printf("Failed!\n")); - camel_exception_set(ex, 1, _("Unable to add message to summary: unknown reason")); + camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, + _("Unable to add message to summary: unknown reason")); } return mi; } @@ -475,42 +476,43 @@ local_summary_encode_x_evolution(CamelLocalSummary *cls, const CamelMessageInfo p = uidstr = camel_message_info_uid(mi); while (*p && isdigit(*p)) p++; - if (*p == 0 && sscanf(uidstr, "%u", &uid) == 1) { - g_string_sprintf(out, "%08x-%04x", uid, mi->flags & 0xffff); + if (*p == 0 && sscanf (uidstr, "%u", &uid) == 1) { + g_string_printf (out, "%08x-%04x", uid, mi->flags & 0xffff); } else { - g_string_sprintf(out, "%s-%04x", uidstr, mi->flags & 0xffff); + g_string_printf (out, "%s-%04x", uidstr, mi->flags & 0xffff); } if (flag || tag) { - val = g_string_new(""); - + val = g_string_new (""); + if (flag) { while (flag) { - g_string_append(val, flag->name); + g_string_append (val, flag->name); if (flag->next) - g_string_append_c(val, ','); + g_string_append_c (val, ','); flag = flag->next; } - header_set_param(¶ms, "flags", val->str); - g_string_truncate(val, 0); + header_set_param (¶ms, "flags", val->str); + g_string_truncate (val, 0); } if (tag) { while (tag) { - g_string_append(val, tag->name); - g_string_append_c(val, '='); - g_string_append(val, tag->value); + g_string_append (val, tag->name); + g_string_append_c (val, '='); + g_string_append (val, tag->value); if (tag->next) - g_string_append_c(val, ','); + g_string_append_c (val, ','); tag = tag->next; } - header_set_param(¶ms, "tags", val->str); + header_set_param (¶ms, "tags", val->str); } - g_string_free(val, TRUE); - header_param_list_format_append(out, params); - header_param_list_free(params); + g_string_free (val, TRUE); + header_param_list_format_append (out, params); + header_param_list_free (params); } ret = out->str; - g_string_free(out, FALSE); + g_string_free (out, FALSE); + return ret; } diff --git a/camel/providers/local/camel-maildir-summary.c b/camel/providers/local/camel-maildir-summary.c index ea3c1b8dbf..2075694f63 100644 --- a/camel/providers/local/camel-maildir-summary.c +++ b/camel/providers/local/camel-maildir-summary.c @@ -177,19 +177,19 @@ static struct { /* convert the uid + flags into a unique:info maildir format */ char *camel_maildir_summary_info_to_name(const CamelMessageInfo *info) { + const char *uid; char *p, *buf; int i; - const char *uid; - - uid = camel_message_info_uid(info); - buf = alloca(strlen(uid) + strlen(":2,") + (sizeof(flagbits)/sizeof(flagbits[0])) + 1); - p = buf + sprintf(buf, "%s:2,", uid); - for (i=0;iflags & flagbits[i].flagbit) *p++ = flagbits[i].flag; } *p = 0; - + return g_strdup(buf); } diff --git a/camel/providers/local/camel-mbox-summary.c b/camel/providers/local/camel-mbox-summary.c index 5b001c0977..41ebe28fa6 100644 --- a/camel/providers/local/camel-mbox-summary.c +++ b/camel/providers/local/camel-mbox-summary.c @@ -561,14 +561,16 @@ camel_mbox_summary_build_from(struct _header_raw *header) /* a pseudo, but still bogus attempt at thread safing the function */ /*memcpy(&tm, gmtime(&thetime), sizeof(tm));*/ - gmtime_r(&thetime, &tm); - - g_string_sprintfa(out, " %s %s %2d %02d:%02d:%02d %4d\n", - tz_days[tm.tm_wday], - tz_months[tm.tm_mon], tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_year + 1900); - + gmtime_r (&thetime, &tm); + + g_string_append_printf (out, " %s %s %2d %02d:%02d:%02d %4d\n", + tz_days[tm.tm_wday], tz_months[tm.tm_mon], + tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, + tm.tm_year + 1900); + ret = out->str; - g_string_free(out, FALSE); + g_string_free (out, FALSE); + return ret; } @@ -594,8 +596,8 @@ mbox_summary_sync_full(CamelMboxSummary *mbs, gboolean expunge, CamelFolderChang return -1; } - tmpname = alloca(strlen (cls->folder_path) + 5); - sprintf(tmpname, "%s.tmp", cls->folder_path); + tmpname = g_alloca (strlen (cls->folder_path) + 5); + sprintf (tmpname, "%s.tmp", cls->folder_path); d(printf("Writing tmp file to %s\n", tmpname)); fdout = open(tmpname, O_WRONLY|O_CREAT|O_TRUNC, 0600); if (fdout == -1) { diff --git a/camel/providers/local/camel-mh-store.c b/camel/providers/local/camel-mh-store.c index 7fe68ef4b5..73a3d2046f 100644 --- a/camel/providers/local/camel-mh-store.c +++ b/camel/providers/local/camel-mh-store.c @@ -114,15 +114,15 @@ folders_update(const char *root, const char *folder, int mode) char *tmp, *tmpnew, *line = NULL; CamelStream *stream, *in = NULL, *out = NULL; - tmpnew = alloca(strlen(root)+16); - sprintf(tmpnew, "%s.folders~", root); + tmpnew = g_alloca (strlen (root) + 16); + sprintf (tmpnew, "%s.folders~", root); out = camel_stream_fs_new_with_name(tmpnew, O_WRONLY|O_CREAT|O_TRUNC, 0666); if (out == NULL) goto fail; - tmp = alloca(strlen(root)+16); - sprintf(tmp, "%s.folders", root); + tmp = g_alloca (strlen (root) + 16); + sprintf (tmp, "%s.folders", root); stream = camel_stream_fs_new_with_name(tmp, O_RDONLY, 0); if (stream) { in = camel_stream_buffer_new(stream, CAMEL_STREAM_BUFFER_READ); @@ -338,8 +338,8 @@ static void recursive_scan(CamelStore *store, CamelFolderInfo **fip, CamelFolder /* Open the specified directory. */ if (path[0]) { - fullpath = alloca(strlen(root)+strlen(path)+2); - sprintf(fullpath, "%s/%s", root, path); + fullpath = alloca (strlen (root) + strlen (path) + 2); + sprintf (fullpath, "%s/%s", root, path); } else fullpath = (char *)root; @@ -407,8 +407,8 @@ folders_scan(CamelStore *store, const char *root, const char *top, CamelFolderIn GHashTable *visited; int len; - tmp = alloca(strlen(root)+16); - sprintf(tmp, "%s/.folders", root); + tmp = g_alloca (strlen (root) + 16); + sprintf (tmp, "%s/.folders", root); stream = camel_stream_fs_new_with_name(tmp, 0, O_RDONLY); if (stream == NULL) return; diff --git a/camel/providers/local/camel-spool-store.c b/camel/providers/local/camel-spool-store.c index 9419d897a8..c8d76f8a63 100644 --- a/camel/providers/local/camel-spool-store.c +++ b/camel/providers/local/camel-spool-store.c @@ -273,8 +273,8 @@ static int scan_dir(CamelStore *store, GHashTable *visited, char *root, const ch /* look for folders matching the right structure, recursively */ if (path) { - name = alloca(strlen(root)+strlen(path)+2); - sprintf(name, "%s/%s", root, path); + name = g_alloca (strlen (root) + strlen (path) + 2); + sprintf (name, "%s/%s", root, path); } else name = root; diff --git a/camel/providers/local/camel-spool-summary.c b/camel/providers/local/camel-spool-summary.c index d71c75eaf8..d914af87e2 100644 --- a/camel/providers/local/camel-spool-summary.c +++ b/camel/providers/local/camel-spool-summary.c @@ -155,14 +155,14 @@ spool_summary_sync_full(CamelMboxSummary *cls, gboolean expunge, CamelFolderChan } #ifdef HAVE_MKSTEMP - tmpname = alloca(64); - sprintf(tmpname, "/tmp/spool.camel.XXXXXX"); - fdout = mkstemp(tmpname); + tmpname = alloca (64); + sprintf (tmpname, "/tmp/spool.camel.XXXXXX"); + fdout = mkstemp (tmpname); #else #warning "Your system has no mkstemp(3), spool updating may be insecure" - tmpname = alloca(L_tmpnam); - tmpnam(tmpname); - fdout = open(tmpname, O_RDWR|O_CREAT|O_EXCL, 0600); + tmpname = alloca (L_tmpnam); + tmpnam (tmpname); + fdout = open (tmpname, O_RDWR|O_CREAT|O_EXCL, 0600); #endif d(printf("Writing tmp file to %s\n", tmpname)); if (fdout == -1) { diff --git a/camel/providers/nntp/Makefile.am b/camel/providers/nntp/Makefile.am index 5ef9ba71f7..b5deeca2cd 100644 --- a/camel/providers/nntp/Makefile.am +++ b/camel/providers/nntp/Makefile.am @@ -14,7 +14,8 @@ INCLUDES = -I../.. \ $(CAMEL_CFLAGS) \ $(GNOME_INCLUDEDIR) \ $(GTK_INCLUDEDIR) \ - -DG_LOG_DOMAIN=\"camel-nntp-provider\" + -DG_LOG_DOMAIN=\"camel-nntp-provider\" \ + -DG_DISABLE_DEPRECATED libcamelnntp_la_SOURCES = \ camel-nntp-provider.c \ diff --git a/camel/providers/pop3/Makefile.am b/camel/providers/pop3/Makefile.am index 9e94c5c89a..34fa38183c 100644 --- a/camel/providers/pop3/Makefile.am +++ b/camel/providers/pop3/Makefile.am @@ -16,7 +16,8 @@ INCLUDES = \ $(CAMEL_CFLAGS) \ $(GNOME_INCLUDEDIR) \ $(GTK_INCLUDEDIR) \ - -DG_LOG_DOMAIN=\"camel-pop3-provider\" + -DG_LOG_DOMAIN=\"camel-pop3-provider\" \ + -DG_DISABLE_DEPRECATED libcamelpop3_la_SOURCES = \ camel-pop3-engine.c \ diff --git a/camel/providers/sendmail/Makefile.am b/camel/providers/sendmail/Makefile.am index 57834b9853..35632d318b 100644 --- a/camel/providers/sendmail/Makefile.am +++ b/camel/providers/sendmail/Makefile.am @@ -5,17 +5,18 @@ libcamelsendmailincludedir = $(includedir)/camel camel_provider_LTLIBRARIES = libcamelsendmail.la camel_provider_DATA = libcamelsendmail.urls -INCLUDES = \ - -I.. \ - -I$(srcdir)/.. \ - -I$(srcdir)/../../.. \ - -I$(includedir) \ - -I$(top_srcdir)/intl \ - -I$(top_srcdir)/camel \ - $(CAMEL_CFLAGS) \ - $(GNOME_INCLUDEDIR) \ - $(GTK_INCLUDEDIR) \ - -DG_LOG_DOMAIN=\"camel-sendmail-provider\" +INCLUDES = \ + -I.. \ + -I$(srcdir)/.. \ + -I$(srcdir)/../../.. \ + -I$(includedir) \ + -I$(top_srcdir)/intl \ + -I$(top_srcdir)/camel \ + $(CAMEL_CFLAGS) \ + $(GNOME_INCLUDEDIR) \ + $(GTK_INCLUDEDIR) \ + -DG_LOG_DOMAIN=\"camel-sendmail-provider\" \ + -DG_DISABLE_DEPRECATED libcamelsendmail_la_SOURCES = \ camel-sendmail-provider.c \ -- cgit v1.2.3