if (first == NULL) {
if (second == NULL)
return NULL;
- else
+ else
return second;
} else if (second == NULL)
return first;
}
return ret;
}
-
+
static void hash_free_strings_func(gpointer key, gpointer value, gpointer data)
{
g_free(key);
return str;
}
-void file_strip_crs(const gchar *file)
+void file_strip_crs(const gchar *file)
{
FILE *fp = NULL, *outfp = NULL;
gchar buf[4096];
gchar *out = get_tmp_file();
if (file == NULL)
goto freeout;
-
+
fp = fopen(file, "rb");
if (!fp)
goto freeout;
strcrchomp(buf);
fputs(buf, outfp);
}
-
+
fclose(fp);
fclose(outfp);
rename_force(out, file);
g_strstrip(str);
srcp = str + subject_get_prefix_length(str);
- if (srcp != str)
+ if (srcp != str)
memmove(str, srcp, strlen(srcp) + 1);
}
register gchar *srcp;
gchar op, cl;
gint in_brace;
-
+
g_strstrip(str);
srcp = str + subject_get_prefix_length(str);
quote_level++;
else if (*p != '-' && !g_ascii_isspace(*p) && p <= last_pos) {
/* any characters are allowed except '-' and space */
- while (*p != '-'
- && !strchr(quote_chars, *p)
- && !g_ascii_isspace(*p)
+ while (*p != '-'
+ && !strchr(quote_chars, *p)
+ && !g_ascii_isspace(*p)
&& p < last_pos)
p++;
if (strchr(quote_chars, *p))
return 0;
}
-const gchar * line_has_quote_char(const gchar * str, const gchar *quote_chars)
+const gchar * line_has_quote_char(const gchar * str, const gchar *quote_chars)
{
gchar * position = NULL;
gchar * tmp_pos = NULL;
if (quote_chars == NULL)
return FALSE;
-
+
for (i = 0; i < strlen(quote_chars); i++) {
tmp_pos = strchr (str, quote_chars[i]);
- if(position == NULL
+ if(position == NULL
|| (tmp_pos != NULL && position >= tmp_pos) )
position = tmp_pos;
}
- return position;
+ return position;
}
-const gchar * line_has_quote_char_last(const gchar * str, const gchar *quote_chars)
+const gchar * line_has_quote_char_last(const gchar * str, const gchar *quote_chars)
{
gchar * position = NULL;
gchar * tmp_pos = NULL;
if (quote_chars == NULL)
return FALSE;
-
+
for (i = 0; i < strlen(quote_chars); i++) {
tmp_pos = strrchr (str, quote_chars[i]);
- if(position == NULL
+ if(position == NULL
|| (tmp_pos != NULL && position <= tmp_pos) )
position = tmp_pos;
}
- return position;
+ return position;
}
gchar *strstr_with_skip_quote(const gchar *haystack, const gchar *needle)
return result;
}
-/* Converts two-digit hexadecimal to decimal. Used for unescaping escaped
+/* Converts two-digit hexadecimal to decimal. Used for unescaping escaped
* characters
*/
static gint axtoi(const gchar *hexstr)
{
gint hi, lo, result;
-
+
hi = hexstr[0];
if ('0' <= hi && hi <= '9') {
hi -= '0';
return 0;
}
-\f
+
#ifdef G_OS_WIN32
-#include <windows.h>
+#include <windows.h>
#ifndef CSIDL_APPDATA
#define CSIDL_APPDATA 0x001a
#endif
return 0;
}
return -1;
-}
+}
static HRESULT
w32_shgetfolderpath (HWND a, int b, HANDLE c, DWORD d, LPSTR e)
/* Return the default directory for Plugins. */
const gchar *get_plugin_dir(void)
{
-#ifdef G_OS_WIN32
+#ifdef G_OS_WIN32
static gchar *plugin_dir = NULL;
if (!plugin_dir)
/* Test on whether FILE is a relative file name. This is
* straightforward for Unix but more complex for Windows. */
-gboolean is_relative_filename(const gchar *file)
+gboolean is_relative_filename(const gchar *file)
{
if (!file)
return TRUE;
return !(*file == '\\' || *file == '/');
#else
return !(*file == G_DIR_SEPARATOR);
-#endif
+#endif
}
FILE_OP_ERROR(src, "fopen");
return -1;
}
-
+
if ((dest_fp = g_fopen(dest, "ab")) == NULL) {
FILE_OP_ERROR(dest, "fopen");
fclose(src_fp);
* uniqueness if everything is either quoted-printable or base64
* encoded (note that conversion is allowed), but because MIME bodies
* may be nested, it may happen that the same boundary has already
- * been used.
+ * been used.
*
* boundary := 0*69<bchars> bcharsnospace
* bchars := bcharsnospace / " "
}
else {
char * hexa = "0123456789ABCDEF";
-
+
if (k + 4 >= bufsize)
break;
encoded_uri[k++] = '%';
gchar buf[BUFFSIZE];
gchar *p;
gchar encoded_uri[BUFFSIZE];
-
+
g_return_val_if_fail(uri != NULL, -1);
/* an option to choose whether to use encode_uri or not ? */
encode_uri(encoded_uri, BUFFSIZE, uri);
-
+
if (cmdline &&
(p = strchr(cmdline, '%')) && *(p + 1) == 's' &&
!strchr(p + 2, '%'))
if (subject == NULL)
return;
- subject += subject_get_prefix_length(subject);
+ subject += subject_get_prefix_length(subject);
g_hash_table_remove(subject_table, subject);
}
/*!
- *\brief Check if a string is prefixed with known (combinations)
- * of prefixes. The function assumes that each prefix
+ *\brief Check if a string is prefixed with known (combinations)
+ * of prefixes. The function assumes that each prefix
* is terminated by zero or exactly _one_ space.
*
*\param str String to check for a prefixes
*
- *\return int Number of chars in the prefix that should be skipped
+ *\return int Number of chars in the prefix that should be skipped
* for a "clean" subject line. If no prefix was found, 0
* is returned.
- */
+ */
int subject_get_prefix_length(const gchar *subject)
{
/*!< Array with allowable reply prefixes regexps. */
if (!init_) {
GString *s = g_string_new("");
-
+
for (n = 0; n < PREFIXES; n++)
/* Terminate each prefix regexpression by a
* "\ ?" (zero or ONE space), and OR them */
g_string_append_printf(s, "(%s\\ ?)%s",
prefixes[n],
- n < PREFIXES - 1 ?
+ n < PREFIXES - 1 ?
"|" : "");
-
+
g_string_prepend(s, "(");
g_string_append(s, ")+"); /* match at least once */
g_string_prepend(s, "^\\ *"); /* from beginning of line */
-
- /* We now have something like "^\ *((PREFIX1\ ?)|(PREFIX2\ ?))+"
+
+ /* We now have something like "^\ *((PREFIX1\ ?)|(PREFIX2\ ?))+"
* TODO: Should this be "^\ *(((PREFIX1)|(PREFIX2))\ ?)+" ??? */
- if (regcomp(®ex, s->str, REG_EXTENDED | REG_ICASE)) {
+ if (regcomp(®ex, s->str, REG_EXTENDED | REG_ICASE)) {
debug_print("Error compiling regexp %s\n", s->str);
g_string_free(s, TRUE);
return 0;
g_string_free(s, TRUE);
}
}
-
+
if (!regexec(®ex, subject, 1, &pos, 0) && pos.rm_so != -1)
return pos.rm_eo;
else
/*
quote_cmd_argument()
-
+
return a quoted string safely usable in argument of a command.
-
+
code is extracted and adapted from etPan! project -- DINH V. HoĆ .
*/
if (isalnum((guchar)*p) || (* p == '/')) {
if (remaining > 0) {
* result_p = * p;
- result_p ++;
+ result_p ++;
remaining --;
}
else {
return -1;
}
}
- else {
+ else {
if (remaining >= 2) {
* result_p = '\\';
- result_p ++;
+ result_p ++;
* result_p = * p;
- result_p ++;
+ result_p ++;
remaining -= 2;
}
else {
result[size - 1] = '\0';
return -1;
}
-
+
return 0;
}
-typedef struct
+typedef struct
{
GNode *parent;
GNodeMapFunc func;
*\brief Register ref counted pointer. It is based on GBoxed, so should
* work with anything that uses the GType system. The semantics
* are similar to a C++ auto pointer, with the exception that
- * C doesn't have automatic closure (calling destructors) when
+ * C doesn't have automatic closure (calling destructors) when
* exiting a block scope.
* Use the \ref G_TYPE_AUTO_POINTER macro instead of calling this
* function directly.
("G_TYPE_AUTO_POINTER",
(GBoxedCopyFunc) g_auto_pointer_copy,
(GBoxedFreeFunc) g_auto_pointer_free);
- return auto_pointer_type;
+ return auto_pointer_type;
}
/*!
/*!
*\brief Creates an auto pointer for a g_new()ed pointer. Example:
*
- *\code
+ *\code
*
* ... tell gtk_list_store it should use a G_TYPE_AUTO_POINTER
* ... when assigning, copying and freeing storage elements
*
- * gtk_list_store_new(N_S_COLUMNS,
+ * gtk_list_store_new(N_S_COLUMNS,
* G_TYPE_AUTO_POINTER,
* -1);
*
* S_DATA, protect,
* -1);
*
- * ... the gtk_list_store has copied the pointer and
+ * ... the gtk_list_store has copied the pointer and
* ... incremented its reference count, we should free
* ... the auto pointer (in C++ a destructor would do
* ... this for us when leaving block scope)
- *
+ *
* g_auto_pointer_free(protect);
*
* ... gtk_list_store_set() now manages the data. When
- * ... *explicitly* requesting a pointer from the list
- * ... store, don't forget you get a copy that should be
+ * ... *explicitly* requesting a pointer from the list
+ * ... store, don't forget you get a copy that should be
* ... freed with g_auto_pointer_free() eventually.
*
*\endcode
{
AutoPointerRef *ref;
AutoPointer *ptr;
-
- if (p == NULL)
+
+ if (p == NULL)
return NULL;
ref = g_new0(AutoPointerRef, 1);
GAuto *g_auto_pointer_new_with_free(gpointer p, GFreeFunc free_)
{
AutoPointer *aptr;
-
+
if (p == NULL)
return NULL;
aptr = g_auto_pointer_new(p);
aptr->ref->free = free_;
- return aptr;
+ return aptr;
}
gpointer g_auto_pointer_get_ptr(GAuto *auto_ptr)
{
- if (auto_ptr == NULL)
+ if (auto_ptr == NULL)
return NULL;
- return ((AutoPointer *) auto_ptr)->ptr;
+ return ((AutoPointer *) auto_ptr)->ptr;
}
/*!
* to call this function directly, unless you copy/assign
* the guarded pointer.
*
- *\param auto_ptr Auto pointer returned by previous call to
+ *\param auto_ptr Auto pointer returned by previous call to
* g_auto_pointer_new_XXX()
*
*\return gpointer An auto pointer
AutoPointerRef *ref;
AutoPointer *newp;
- if (auto_ptr == NULL)
+ if (auto_ptr == NULL)
return NULL;
ptr = auto_ptr;
newp->ref = ref;
newp->ptr = ref->pointer;
++(ref->cnt);
-
+
#ifdef REF_DEBUG
G_PRINT_REF ("XXXX COPY(%lx) -- REF (%d)\n", ref->pointer, ref->cnt);
#endif
{
AutoPointer *ptr;
AutoPointerRef *ref;
-
+
if (auto_ptr == NULL)
return;
#endif
ref->free(ref->pointer);
g_free(ref);
- }
+ }
#ifdef REF_DEBUG
else
G_PRINT_REF ("XXXX DEREF(%lx) -- REF (%d)\n", ref->pointer, ref->cnt);
#endif
- g_free(ptr);
+ g_free(ptr);
}
void replace_returns(gchar *str)
for (ep_ = scanpos; *ep_ != '\0'; ep_++) {
if (!g_ascii_isgraph(*(const guchar *)ep_) ||
!IS_ASCII(*(const guchar *)ep_) ||
- strchr("[]{}<>\"", *ep_))
+ strchr("[]{}()<>\"", *ep_))
break;
}
* should pass some URI type to this function and decide on that whether
* to perform punctuation stripping */
-#define IS_REAL_PUNCT(ch) (g_ascii_ispunct(ch) && !strchr("/?=)", ch))
+#define IS_REAL_PUNCT(ch) (g_ascii_ispunct(ch) && !strchr("/?=-", ch))
for (; ep_ - 1 > scanpos + 1 &&
IS_REAL_PUNCT(*(ep_ - 1));
*ep = ep_;
- return TRUE;
+ return TRUE;
}
gchar *make_uri_string(const gchar *bp, const gchar *ep)
"tc", "td", "tf", "tg", "th", "tj", "tk", "tm", "tn", "to",
"tp", "tr", "tt", "tv", "tw", "tz", "ua", "ug", "uk", "um",
"us", "uy", "uz", "va", "vc", "ve", "vg", "vi", "vn", "vu",
- "wf", "ws", "ye", "yt", "yu", "za", "zm", "zw"
+ "wf", "ws", "ye", "yt", "yu", "za", "zm", "zw"
};
gint n;
GHashTable *htab = g_hash_table_new(g_stricase_hash, g_stricase_equal);
-
+
g_return_val_if_fail(htab, NULL);
- for (n = 0; n < sizeof toplvl_domains / sizeof toplvl_domains[0]; n++)
+ for (n = 0; n < sizeof toplvl_domains / sizeof toplvl_domains[0]; n++)
g_hash_table_insert(htab, (gpointer) toplvl_domains[n], (gpointer) toplvl_domains[n]);
return htab;
}
gchar buf[MAX_LVL_DOM_NAME_LEN + 1];
const gchar *m = buf + MAX_LVL_DOM_NAME_LEN + 1;
register gchar *p;
-
+
if (last - first > MAX_LVL_DOM_NAME_LEN || first > last)
return FALSE;
const gchar *last_dot = NULL;
const gchar *prelast_dot = NULL;
const gchar *last_tld_char = NULL;
-
+
/* the informative part of the email address (describing the name
* of the email address owner) may contain quoted parts. the
* closure stack stores the last encountered quotes. */
start++;
*bp = start;
-
+
/* find end (either , or ; or end of line) */
if (strstr(start, ",") && strstr(start, ";"))
*ep = strstr(start,",") < strstr(start, ";")
*ep = strstr(start, ";");
else
*ep = start+strlen(start);
-
- /* check there's still an @ in that, or search
+
+ /* check there's still an @ in that, or search
* further if possible */
if (strstr(start, "@") && strstr(start, "@") < *ep)
return TRUE;
if (!dom_tab)
dom_tab = create_domain_tab();
- g_return_val_if_fail(dom_tab, FALSE);
+ g_return_val_if_fail(dom_tab, FALSE);
/* scan start of address */
for (bp_ = scanpos - 1;
if (!result) return FALSE;
- if (*ep_ && *(bp_ - 1) == '"' && *(ep_) == '"'
+ if (*ep_ && *(bp_ - 1) == '"' && *(ep_) == '"'
&& *(ep_ + 1) == ' ' && *(ep_ + 2) == '<'
&& IS_RFC822_CHAR(*(ep_ + 3))) {
- /* this informative part with an @ in it is
+ /* this informative part with an @ in it is
* followed by the email address */
ep_ += 3;
-
+
/* go to matching '>' (or next non-rfc822 char, like \n) */
for (; *ep_ != '>' && *ep != '\0' && IS_RFC822_CHAR(*ep_); ep_++)
;
-
+
/* include the bracket */
if (*ep_ == '>') ep_++;
-
- /* include the leading quote */
+
+ /* include the leading quote */
bp_--;
*ep = ep_;
}
/* if nothing in the closure stack, do the special conditions
- * the following if..else expression simply checks whether
+ * the following if..else expression simply checks whether
* a token is acceptable. if not acceptable, the clause
* should terminate the loop with a 'break' */
if (!PEEK_STACK()) {
*bp = bp_;
*ep = ep_;
-
+
return result;
}
gchar *trimmed = parts[0];
while (trimmed[0] == ' ')
trimmed++;
- while (trimmed[strlen(trimmed)-1] == ' ')
+ while (trimmed[strlen(trimmed)-1] == ' ')
trimmed[strlen(trimmed)-1] = '\0';
-
+
if (!strcmp(trimmed, type)) {
trimmed = parts[1];
while (trimmed[0] == ' ')
trimmed++;
- while (trimmed[strlen(trimmed)-1] == ' ')
+ while (trimmed[strlen(trimmed)-1] == ' ')
trimmed[strlen(trimmed)-1] = '\0';
- while (trimmed[strlen(trimmed)-1] == '\n')
+ while (trimmed[strlen(trimmed)-1] == '\n')
trimmed[strlen(trimmed)-1] = '\0';
- while (trimmed[strlen(trimmed)-1] == '\r')
+ while (trimmed[strlen(trimmed)-1] == '\r')
trimmed[strlen(trimmed)-1] = '\0';
result = g_strdup(trimmed);
g_strfreev(parts);
fclose(fp);
return NULL;
}
-gchar *mailcap_get_command_for_type(const gchar *type)
+gchar *mailcap_get_command_for_type(const gchar *type)
{
gchar *result = NULL;
gchar *path = NULL;
{
GDir *dir;
const gchar *name;
-
+
if ((dir = g_dir_open(src, 0, NULL)) == NULL) {
g_warning("failed to open directory: %s\n", src);
return -1;
if (make_dir(dst) < 0)
return -1;
-
+
while ((name = g_dir_read_name(dir)) != NULL) {
gchar *old_file, *new_file;
old_file = g_strconcat(src, G_DIR_SEPARATOR_S, name, NULL);