[geary/geary-0.12] Revert "Remove a number of redundant fns in Engine.Util.Ascii."
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/geary-0.12] Revert "Remove a number of redundant fns in Engine.Util.Ascii."
- Date: Thu, 17 May 2018 06:01:54 +0000 (UTC)
commit 08dea248bb4225d961f29cdc6faea41d6cba0edf
Author: Michael James Gratton <mike vee net>
Date: Thu May 10 15:18:32 2018 +1000
Revert "Remove a number of redundant fns in Engine.Util.Ascii."
This reverts commit 1d8c4aea80248babfb2d05153ea7191302c0bc3e, which
(re-broke) IMAP and STMP ptotocol parsing when running under the
Turkish tr_TR.UTF-8 locale.
Fixes Bug 795906.
src/engine/imap/message/imap-data-format.vala | 6 +-
.../message/imap-fetch-body-data-specifier.vala | 22 +++----
src/engine/imap/message/imap-internal-date.vala | 8 +-
.../imap/message/imap-mailbox-specifier.vala | 24 ++++----
.../imap/parameter/imap-string-parameter.vala | 16 +++---
.../imap/response/imap-response-code-type.vala | 8 +-
src/engine/mime/mime-content-parameters.vala | 8 +-
src/engine/mime/mime-disposition-type.vala | 14 ++--
src/engine/mime/mime-multipart-subtype.vala | 14 ++--
src/engine/rfc822/rfc822-mailbox-address.vala | 4 +-
src/engine/smtp/smtp-command.vala | 22 ++++----
src/engine/smtp/smtp-greeting.vala | 10 ++--
src/engine/util/util-ascii.vala | 59 ++++++++++++++++---
13 files changed, 126 insertions(+), 89 deletions(-)
---
diff --git a/src/engine/imap/message/imap-data-format.vala b/src/engine/imap/message/imap-data-format.vala
index 17a7ed5..64879af 100644
--- a/src/engine/imap/message/imap-data-format.vala
+++ b/src/engine/imap/message/imap-data-format.vala
@@ -23,10 +23,10 @@ public enum Quoting {
private bool is_special_char(char ch, char[] ar, string? exceptions) {
if (ch > 0x7F || ch.iscntrl())
return true;
-
+
if (ch in ar)
- return (exceptions != null) ? exceptions.index_of_char(ch) < 0 : true;
-
+ return (exceptions != null) ? Ascii.index_of(exceptions, ch) < 0 : true;
+
return false;
}
diff --git a/src/engine/imap/message/imap-fetch-body-data-specifier.vala
b/src/engine/imap/message/imap-fetch-body-data-specifier.vala
index b45ba89..b2dda65 100644
--- a/src/engine/imap/message/imap-fetch-body-data-specifier.vala
+++ b/src/engine/imap/message/imap-fetch-body-data-specifier.vala
@@ -73,15 +73,15 @@ public class Geary.Imap.FetchBodyDataSpecifier : BaseObject, Gee.Hashable<FetchB
assert_not_reached();
}
}
-
+
public static SectionPart deserialize(string value) throws ImapError {
if (String.is_empty(value))
return NONE;
-
- switch (value.down()) {
+
+ switch (Ascii.strdown(value)) {
case "header":
return HEADER;
-
+
case "header.fields":
return HEADER_FIELDS;
@@ -178,25 +178,23 @@ public class Geary.Imap.FetchBodyDataSpecifier : BaseObject, Gee.Hashable<FetchB
this.subset_start = subset_start;
this.subset_count = subset_count;
this.is_peek = is_peek;
-
+
if (field_names != null && field_names.length > 0) {
- this.field_names = new Gee.TreeSet<string>((s1, s2) => {
- return GLib.strcmp(s1, s2);
- });
+ this.field_names = new Gee.TreeSet<string>(Ascii.strcmp);
foreach (string field_name in field_names) {
- string converted = field_name.strip().down();
-
+ string converted = Ascii.strdown(field_name.strip());
+
if (!String.is_empty(converted))
this.field_names.add(converted);
}
} else {
this.field_names = null;
}
-
+
// see equal_to() for why the response version is used
hashable = serialize_response();
}
-
+
/**
* Returns the {@link FetchBodyDataSpecifier} in a string ready for a {@link Command}.
*
diff --git a/src/engine/imap/message/imap-internal-date.vala b/src/engine/imap/message/imap-internal-date.vala
index 3240ba0..50317e2 100644
--- a/src/engine/imap/message/imap-internal-date.vala
+++ b/src/engine/imap/message/imap-internal-date.vala
@@ -64,18 +64,18 @@ public class Geary.Imap.InternalDate : Geary.MessageData.AbstractMessageData, Ge
|| year < 1970) {
throw new ImapError.PARSE_ERROR("Invalid INTERNALDATE \"%s\": bad numerical range",
internaldate);
}
-
+
// check month (this catches localization problems)
int month = -1;
- string mon_down = ((string) mon).down();
+ string mon_down = Ascii.strdown(((string) mon));
for (int ctr = 0; ctr < EN_US_MON_DOWN.length; ctr++) {
if (mon_down == EN_US_MON_DOWN[ctr]) {
month = ctr;
-
+
break;
}
}
-
+
if (month < 0)
throw new ImapError.PARSE_ERROR("Invalid INTERNALDATE \"%s\": bad month", internaldate);
diff --git a/src/engine/imap/message/imap-mailbox-specifier.vala
b/src/engine/imap/message/imap-mailbox-specifier.vala
index fa0c7c0..d675895 100644
--- a/src/engine/imap/message/imap-mailbox-specifier.vala
+++ b/src/engine/imap/message/imap-mailbox-specifier.vala
@@ -72,7 +72,7 @@ public class Geary.Imap.MailboxSpecifier : BaseObject, Gee.Hashable<MailboxSpeci
public static bool is_inbox_name(string name) {
return Ascii.stri_equal(name, CANONICAL_INBOX_NAME);
}
-
+
/**
* Returns true if the string is the ''canonical'' name of the IMAP Inbox.
*
@@ -85,9 +85,9 @@ public class Geary.Imap.MailboxSpecifier : BaseObject, Gee.Hashable<MailboxSpeci
* @see is_inbox_name
*/
public static bool is_canonical_inbox_name(string name) {
- return (name == CANONICAL_INBOX_NAME);
+ return Ascii.str_equal(name, CANONICAL_INBOX_NAME);
}
-
+
/**
* Converts a generic {@link FolderPath} into an IMAP mailbox specifier.
*/
@@ -175,27 +175,27 @@ public class Geary.Imap.MailboxSpecifier : BaseObject, Gee.Hashable<MailboxSpeci
public uint hash() {
return is_inbox ? Ascii.stri_hash(name) : Ascii.str_hash(name);
}
-
+
public bool equal_to(MailboxSpecifier other) {
if (this == other)
return true;
-
+
if (is_inbox)
return Ascii.stri_equal(name, other.name);
-
- return (name == other.name);
+
+ return Ascii.str_equal(name, other.name);
}
-
+
public int compare_to(MailboxSpecifier other) {
if (this == other)
return 0;
-
+
if (is_inbox && other.is_inbox)
return 0;
-
- return GLib.strcmp(name, other.name);
+
+ return Ascii.strcmp(name, other.name);
}
-
+
public string to_string() {
return name;
}
diff --git a/src/engine/imap/parameter/imap-string-parameter.vala
b/src/engine/imap/parameter/imap-string-parameter.vala
index 5398451..aee3553 100644
--- a/src/engine/imap/parameter/imap-string-parameter.vala
+++ b/src/engine/imap/parameter/imap-string-parameter.vala
@@ -134,35 +134,35 @@ public abstract class Geary.Imap.StringParameter : Geary.Imap.Parameter {
public bool is_empty() {
return String.is_empty(ascii);
}
-
+
/**
* Case-sensitive comparison.
*/
public bool equals_cs(string value) {
- return (ascii == value);
+ return Ascii.str_equal(ascii, value);
}
-
+
/**
* Case-insensitive comparison.
*/
public bool equals_ci(string value) {
return Ascii.stri_equal(ascii, value);
}
-
+
/**
* Returns the string lowercased.
*/
public string as_lower() {
- return ascii.down();
+ return Ascii.strdown(ascii);
}
-
+
/**
* Returns the string uppercased.
*/
public string as_upper() {
- return ascii.up();
+ return Ascii.strup(ascii);
}
-
+
/**
* Converts the {@link ascii} to a signed 32-bit integer, clamped between clamp_min and
* clamp_max.
diff --git a/src/engine/imap/response/imap-response-code-type.vala
b/src/engine/imap/response/imap-response-code-type.vala
index f0f48ee..79cf75a 100644
--- a/src/engine/imap/response/imap-response-code-type.vala
+++ b/src/engine/imap/response/imap-response-code-type.vala
@@ -64,17 +64,17 @@ public class Geary.Imap.ResponseCodeType : BaseObject, Gee.Hashable<ResponseCode
public ResponseCodeType.from_parameter(StringParameter stringp) throws ImapError {
init(stringp.ascii);
}
-
+
private void init(string ascii) throws ImapError {
// note that is_quoting_required() also catches empty strings (as they require quoting)
if (DataFormat.is_quoting_required(ascii) != DataFormat.Quoting.OPTIONAL)
throw new ImapError.INVALID("\"%s\" cannot be represented as a ResponseCodeType", ascii);
-
+
// store lowercased so it's easily compared with const strings above
original = ascii;
- value = ascii.down();
+ value = Ascii.strdown(ascii);
}
-
+
public bool is_value(string str) {
return Ascii.stri_equal(value, str);
}
diff --git a/src/engine/mime/mime-content-parameters.vala b/src/engine/mime/mime-content-parameters.vala
index 8691655..71e579e 100644
--- a/src/engine/mime/mime-content-parameters.vala
+++ b/src/engine/mime/mime-content-parameters.vala
@@ -78,7 +78,7 @@ public class Geary.Mime.ContentParameters : BaseObject {
return (stored != null) ? Ascii.stri_equal(stored, value) : false;
}
-
+
/**
* Returns true if the attribute has the supplied value (case-sensitive comparison).
*
@@ -86,10 +86,10 @@ public class Geary.Mime.ContentParameters : BaseObject {
*/
public bool has_value_cs(string attribute, string value) {
string? stored = params.get(attribute);
-
- return (stored != null) ? (stored == value) : false;
+
+ return (stored != null) ? Ascii.str_equal(stored, value) : false;
}
-
+
/**
* Add or replace the parameter.
*
diff --git a/src/engine/mime/mime-disposition-type.vala b/src/engine/mime/mime-disposition-type.vala
index 01d195f..18e27b2 100644
--- a/src/engine/mime/mime-disposition-type.vala
+++ b/src/engine/mime/mime-disposition-type.vala
@@ -31,24 +31,24 @@ public enum Geary.Mime.DispositionType {
*/
public static DispositionType deserialize(string? str, out bool is_unknown) {
is_unknown = false;
-
+
if (String.is_empty_or_whitespace(str))
return UNSPECIFIED;
-
- switch (str.down()) {
+
+ switch (Ascii.strdown(str)) {
case "inline":
return INLINE;
-
+
case "attachment":
return ATTACHMENT;
-
+
default:
is_unknown = true;
-
+
return ATTACHMENT;
}
}
-
+
/**
* Returns null if value is {@link UNSPECIFIED}
*/
diff --git a/src/engine/mime/mime-multipart-subtype.vala b/src/engine/mime/mime-multipart-subtype.vala
index 050a38e..4de09a3 100644
--- a/src/engine/mime/mime-multipart-subtype.vala
+++ b/src/engine/mime/mime-multipart-subtype.vala
@@ -48,24 +48,24 @@ public enum Geary.Mime.MultipartSubtype {
public static MultipartSubtype from_content_type(ContentType? content_type, out bool is_unknown) {
if (content_type == null || !content_type.has_media_type("multipart")) {
is_unknown = true;
-
+
return MIXED;
}
-
+
is_unknown = false;
- switch (content_type.media_subtype.down()) {
+ switch (Ascii.strdown(content_type.media_subtype)) {
case "mixed":
return MIXED;
-
+
case "alternative":
return ALTERNATIVE;
-
+
case "related":
return RELATED;
-
+
default:
is_unknown = true;
-
+
return MIXED;
}
}
diff --git a/src/engine/rfc822/rfc822-mailbox-address.vala b/src/engine/rfc822/rfc822-mailbox-address.vala
index 1c3af97..345bed8 100644
--- a/src/engine/rfc822/rfc822-mailbox-address.vala
+++ b/src/engine/rfc822/rfc822-mailbox-address.vala
@@ -53,7 +53,7 @@ public class Geary.RFC822.MailboxAddress : Geary.MessageData.SearchableMessageDa
source_route = null;
- int atsign = address.index_of_char('@');
+ int atsign = Ascii.index_of(address, '@');
if (atsign > 0) {
mailbox = address.slice(0, atsign);
domain = address.slice(atsign + 1, address.length);
@@ -62,7 +62,7 @@ public class Geary.RFC822.MailboxAddress : Geary.MessageData.SearchableMessageDa
domain = "";
}
}
-
+
public MailboxAddress.imap(string? name, string? source_route, string mailbox, string domain) {
this.name = (name != null) ? decode_name(name) : null;
this.source_route = source_route;
diff --git a/src/engine/smtp/smtp-command.vala b/src/engine/smtp/smtp-command.vala
index 2a091d2..47db764 100644
--- a/src/engine/smtp/smtp-command.vala
+++ b/src/engine/smtp/smtp-command.vala
@@ -56,36 +56,36 @@ public enum Geary.Smtp.Command {
assert_not_reached();
}
}
-
+
public static Command deserialize(string str) throws SmtpError {
- switch (str.down()) {
+ switch (Ascii.strdown(str)) {
case "helo":
return HELO;
-
+
case "ehlo":
return EHLO;
-
+
case "quit":
return QUIT;
-
+
case "help":
return HELP;
-
+
case "noop":
return NOOP;
-
+
case "rset":
return RSET;
-
+
case "auth":
return AUTH;
-
+
case "mail":
return MAIL;
-
+
case "rcpt":
return RCPT;
-
+
case "data":
return DATA;
diff --git a/src/engine/smtp/smtp-greeting.vala b/src/engine/smtp/smtp-greeting.vala
index 3eb9115..676ef25 100644
--- a/src/engine/smtp/smtp-greeting.vala
+++ b/src/engine/smtp/smtp-greeting.vala
@@ -25,21 +25,21 @@ public class Geary.Smtp.Greeting : Response {
return "";
}
}
-
+
public static ServerFlavor deserialize(string str) {
- switch (str.up()) {
+ switch (Ascii.strup(str)) {
case "SMTP":
return SMTP;
-
+
case "ESMTP":
return ESMTP;
-
+
default:
return UNSPECIFIED;
}
}
}
-
+
public string? domain { get; private set; default = null; }
public ServerFlavor flavor { get; private set; default = ServerFlavor.UNSPECIFIED; }
public string? message { get; private set; default = null; }
diff --git a/src/engine/util/util-ascii.vala b/src/engine/util/util-ascii.vala
index 20fecc4..4d915f6 100644
--- a/src/engine/util/util-ascii.vala
+++ b/src/engine/util/util-ascii.vala
@@ -4,40 +4,71 @@
* (version 2.1 or later). See the COPYING file in this distribution.
*/
+// These calls are bound to the string class in Vala 0.26. When that version of Vala is the
+// minimum, these can be dropped and Ascii.strup and Ascii.strdown can use the string methods.
+extern string g_ascii_strup(string str, ssize_t len = -1);
+extern string g_ascii_strdown(string str, ssize_t len = -1);
+
namespace Geary.Ascii {
+public int index_of(string str, char ch) {
+ char *strptr = str;
+ int index = 0;
+ for (;;) {
+ char strch = *strptr++;
+
+ if (strch == String.EOS)
+ return -1;
+
+ if (strch == ch)
+ return index;
+
+ index++;
+ }
+}
+
public bool get_next_char(string str, ref int index, out char ch) {
ch = str[index++];
-
+
return ch != String.EOS;
}
-public bool stri_equal(string a, string b) {
- // XXX Is this marginally faster than a.down() == b.down() in the
- // best case, slower in the worse case, so not worth it?
+public inline int strcmp(string a, string b) {
+ return GLib.strcmp(a, b);
+}
+
+public int stricmp(string a, string b) {
char *aptr = a;
char *bptr = b;
for (;;) {
int diff = (int) (*aptr).tolower() - (int) (*bptr).tolower();
if (diff != 0)
- return false;
-
+ return diff;
+
if (*aptr == String.EOS)
- return true;
-
+ return 0;
+
aptr++;
bptr++;
}
}
+public inline bool str_equal(string a, string b) {
+ return a == b;
+}
+
+public inline bool stri_equal(string a, string b) {
+ return stricmp(a, b) == 0;
+}
+
public bool nullable_stri_equal(string? a, string? b) {
if (a == null)
return (b == null);
-
+
// a != null, so always false
if (b == null)
return false;
-
+
return stri_equal(a, b);
}
@@ -55,6 +86,14 @@ public uint nullable_stri_hash(string? str) {
return (str != null) ? stri_hash(str) : 0;
}
+public string strdown(string str) {
+ return g_ascii_strdown(str);
+}
+
+public string strup(string str) {
+ return g_ascii_strup(str);
+}
+
/**
* Returns true if the ASCII string contains only whitespace and at least one numeric character.
*/
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]