annotate mcabber/src/utils.c @ 830:80434fde7cfa

Display presence notification timestamps when they exist These timestamps were used in the roster, but not in the buffer window message nor in the history logfile. Reported by "ze".
author Mikael Berthe <mikael@lilotux.net>
date Wed, 03 May 2006 11:28:41 +0200
parents a6628f0aabc1
children fe57dd753a56
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
1 /*
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
2 * utils.c -- Various utility functions
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 378
diff changeset
3 *
699
ee03b56b93ee Update Copyright (2006)
Mikael Berthe <mikael@lilotux.net>
parents: 655
diff changeset
4 * Copyright (C) 2005, 2006 Mikael Berthe <bmikael@lists.lilotux.net>
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
5 * ut_* functions are derived from Cabber debug/log code.
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
6 * from_iso8601() comes from the Gaim project.
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
7 *
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
8 * This program is free software; you can redistribute it and/or modify
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
9 * it under the terms of the GNU General Public License as published by
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or (at
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
11 * your option) any later version.
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
12 *
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
13 * This program is distributed in the hope that it will be useful, but
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
16 * General Public License for more details.
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
17 *
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
18 * You should have received a copy of the GNU General Public License
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
19 * along with this program; if not, write to the Free Software
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
21 * USA
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
22 */
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
23
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
24 #include <stdio.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
25 #include <stdlib.h>
77
32f54ad6d729 [/trunk] Changeset 91 by mikael
mikael
parents: 76
diff changeset
26 #include <string.h>
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
27 #include <stdarg.h>
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
28
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
29 /* For Cygwin (thanks go to Yitzchak Scott-Thoennes) */
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
30 #ifdef __CYGWIN__
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
31 # define timezonevar
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
32 extern long timezone;
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
33 #endif
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
34 #include <time.h>
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
35 #include <unistd.h>
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
36 #include <sys/types.h>
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
37 #include <sys/stat.h>
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
38 #include <ctype.h>
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
39 #include <glib.h>
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
40
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
41 #include <config.h>
378
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
42 #include "logprint.h"
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
43
76
a8f8492abd44 [/trunk] Changeset 90 by mikael
mikael
parents: 24
diff changeset
44 static int DebugEnabled;
77
32f54ad6d729 [/trunk] Changeset 91 by mikael
mikael
parents: 76
diff changeset
45 static char *FName;
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
46
281
f562b9af2de7 Add "const" specifier in prototypes
Mikael Berthe <mikael@lilotux.net>
parents: 241
diff changeset
47 void ut_InitDebug(unsigned int level, const char *filename)
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
48 {
77
32f54ad6d729 [/trunk] Changeset 91 by mikael
mikael
parents: 76
diff changeset
49 FILE *fp;
428
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
50 struct stat buf;
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
51 int err;
77
32f54ad6d729 [/trunk] Changeset 91 by mikael
mikael
parents: 76
diff changeset
52
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
53 if (level < 1) {
138
250f872c722f [/trunk] Changeset 150 by mikael
mikael
parents: 81
diff changeset
54 DebugEnabled = 0;
250f872c722f [/trunk] Changeset 150 by mikael
mikael
parents: 81
diff changeset
55 FName = NULL;
250f872c722f [/trunk] Changeset 150 by mikael
mikael
parents: 81
diff changeset
56 return;
250f872c722f [/trunk] Changeset 150 by mikael
mikael
parents: 81
diff changeset
57 }
250f872c722f [/trunk] Changeset 150 by mikael
mikael
parents: 81
diff changeset
58
250f872c722f [/trunk] Changeset 150 by mikael
mikael
parents: 81
diff changeset
59 if (filename)
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
60 FName = g_strdup(filename);
77
32f54ad6d729 [/trunk] Changeset 91 by mikael
mikael
parents: 76
diff changeset
61 else {
138
250f872c722f [/trunk] Changeset 150 by mikael
mikael
parents: 81
diff changeset
62 FName = getenv("HOME");
250f872c722f [/trunk] Changeset 150 by mikael
mikael
parents: 81
diff changeset
63 if (!FName)
250f872c722f [/trunk] Changeset 150 by mikael
mikael
parents: 81
diff changeset
64 FName = "/tmp/mcabberlog";
250f872c722f [/trunk] Changeset 150 by mikael
mikael
parents: 81
diff changeset
65 else {
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
66 char *tmpname = g_new(char, strlen(FName) + 12);
138
250f872c722f [/trunk] Changeset 150 by mikael
mikael
parents: 81
diff changeset
67 strcpy(tmpname, FName);
250f872c722f [/trunk] Changeset 150 by mikael
mikael
parents: 81
diff changeset
68 strcat(tmpname, "/mcabberlog");
250f872c722f [/trunk] Changeset 150 by mikael
mikael
parents: 81
diff changeset
69 FName = tmpname;
250f872c722f [/trunk] Changeset 150 by mikael
mikael
parents: 81
diff changeset
70 }
77
32f54ad6d729 [/trunk] Changeset 91 by mikael
mikael
parents: 76
diff changeset
71 }
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
72
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
73 DebugEnabled = level;
76
a8f8492abd44 [/trunk] Changeset 90 by mikael
mikael
parents: 24
diff changeset
74
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
75 fp = fopen(FName, "a");
378
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
76 if (!fp) {
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
77 fprintf(stderr, "ERROR: Cannot open tracelog file\n");
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
78 return;
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
79 }
428
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
80
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
81 err = fstat(fileno(fp), &buf);
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
82 if (err || buf.st_uid != geteuid()) {
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
83 fclose(fp);
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
84 DebugEnabled = 0;
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
85 FName = NULL;
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
86 if (err) {
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
87 fprintf(stderr, "ERROR: cannot stat the tracelog file!\n");
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
88 } else {
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
89 fprintf(stderr, "ERROR: tracelog file does not belong to you!\n");
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
90 }
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
91 return;
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
92 }
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
93 fchmod(fileno(fp), S_IRUSR|S_IWUSR);
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
94
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
95 fprintf(fp, "New trace log started.\n"
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
96 "----------------------\n");
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
97 fclose(fp);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
98 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
99
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
100 void ut_WriteLog(unsigned int flag, const char *data)
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
101 {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
102 if (!DebugEnabled || !FName) return;
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 378
diff changeset
103
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
104 if (((DebugEnabled == 2) && (flag & (LPRINT_LOG|LPRINT_DEBUG))) ||
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
105 ((DebugEnabled == 1) && (flag & LPRINT_LOG))) {
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
106 FILE *fp = fopen(FName, "a+");
378
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
107 if (!fp) {
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
108 scr_LogPrint(LPRINT_NORMAL, "ERROR: Cannot open tracelog file");
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
109 return;
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
110 }
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
111 fputs(data, fp);
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
112 fclose(fp);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
113 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
114 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
115
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
116 // checkset_perm(name, setmode)
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
117 // Check the permissions of the "name" file/dir
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
118 // If setmode is true, correct the permissions if they are wrong
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
119 // Return values: -1 == bad file/dir, 0 == success, 1 == cannot correct
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
120 int checkset_perm(const char *name, unsigned int setmode)
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
121 {
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
122 int fd;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
123 struct stat buf;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
124
816
a6628f0aabc1 Skip file permission checks on Cygwin
Mikael Berthe <mikael@lilotux.net>
parents: 803
diff changeset
125 #ifdef __CYGWIN__
a6628f0aabc1 Skip file permission checks on Cygwin
Mikael Berthe <mikael@lilotux.net>
parents: 803
diff changeset
126 // Permission checking isn't efficent on Cygwin
a6628f0aabc1 Skip file permission checks on Cygwin
Mikael Berthe <mikael@lilotux.net>
parents: 803
diff changeset
127 return 0;
a6628f0aabc1 Skip file permission checks on Cygwin
Mikael Berthe <mikael@lilotux.net>
parents: 803
diff changeset
128 #endif
a6628f0aabc1 Skip file permission checks on Cygwin
Mikael Berthe <mikael@lilotux.net>
parents: 803
diff changeset
129
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
130 fd = lstat(name, &buf);
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
131 if (fd == -1) return -1;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
132
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
133 if (buf.st_uid != geteuid()) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
134 scr_LogPrint(LPRINT_LOGNORM, "Wrong file owner [%s]", name);
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
135 return 1;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
136 }
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
137
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
138 if (buf.st_mode & (S_IRGRP | S_IWGRP | S_IXGRP) ||
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
139 buf.st_mode & (S_IROTH | S_IWOTH | S_IXOTH)) {
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
140 if (setmode) {
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
141 mode_t newmode = 0;
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
142 scr_LogPrint(LPRINT_LOGNORM, "Bad permissions [%s]", name);
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
143 if (S_ISDIR(buf.st_mode))
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
144 newmode |= S_IXUSR;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
145 newmode |= S_IRUSR | S_IWUSR;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
146 if (chmod(name, newmode)) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
147 scr_LogPrint(LPRINT_LOGNORM, "WARNING: Failed to correct permissions!");
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
148 return 1;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
149 }
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
150 scr_LogPrint(LPRINT_LOGNORM, "Permissions have been corrected");
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
151 } else {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
152 scr_LogPrint(LPRINT_LOGNORM, "WARNING: Bad permissions [%s]", name);
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
153 return 1;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
154 }
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
155 }
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
156
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
157 return 0;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
158 }
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
159
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
160 const char *ut_get_tmpdir(void)
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
161 {
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
162 static const char *tmpdir;
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
163 const char *tmpvars[] = { "MCABBERTMPDIR", "TMP", "TMPDIR", "TEMP" };
735
2f027806cd48 Some code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 727
diff changeset
164 unsigned int i;
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
165
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
166 if (tmpdir)
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
167 return tmpdir;
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
168
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
169 for (i = 0; i < (sizeof(tmpvars) / sizeof(const char *)); i++) {
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
170 tmpdir = getenv(tmpvars[i]);
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
171 if (tmpdir && tmpdir[0] && tmpdir[0] == '/' && tmpdir[1]) {
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
172 // Looks ok.
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
173 return tmpdir;
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
174 }
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
175 }
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
176
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
177 // Default temporary directory
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
178 tmpdir = "/tmp";
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
179 return tmpdir;
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
180 }
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
181
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
182 // to_iso8601(dststr, timestamp)
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
183 // Convert timestamp to iso8601 format, and store it in dststr.
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
184 // NOTE: dststr should be at last 19 chars long.
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
185 // Return should be 0
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
186 int to_iso8601(char *dststr, time_t timestamp)
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
187 {
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
188 struct tm *tm_time;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
189 int ret;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
190
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
191 tm_time = gmtime(&timestamp);
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
192
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
193 ret = snprintf(dststr, 19, "%.4d%02d%02dT%02d:%02d:%02dZ",
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
194 1900+tm_time->tm_year, tm_time->tm_mon+1, tm_time->tm_mday,
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
195 tm_time->tm_hour, tm_time->tm_min, tm_time->tm_sec);
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
196
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
197 return ((ret == -1) ? -1 : 0);
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
198 }
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
199
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
200 // from_iso8601(timestamp, utc)
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
201 // This function came from the Gaim project, gaim_str_to_time().
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
202 // (Actually date may not be pure iso-8601)
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
203 // Thanks, guys!
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
204 // ** Modified by somian 10 Apr 2006 with advice from ysth.
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
205 time_t from_iso8601(const char *timestamp, int utc)
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
206 {
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
207 struct tm t;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
208 time_t retval = 0;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
209 char buf[32];
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
210 char *c;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
211 int tzoff = 0;
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
212 int hms_succ = 0;
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
213
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
214 time(&retval);
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
215 localtime_r(&retval, &t);
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
216
463
339e85418b49 from_iso8601(): set time to 00:00:00 if not specified
Mikael Berthe <mikael@lilotux.net>
parents: 456
diff changeset
217 /* Reset time to midnight (00:00:00) */
339e85418b49 from_iso8601(): set time to 00:00:00 if not specified
Mikael Berthe <mikael@lilotux.net>
parents: 456
diff changeset
218 t.tm_hour = t.tm_min = t.tm_sec = 0;
339e85418b49 from_iso8601(): set time to 00:00:00 if not specified
Mikael Berthe <mikael@lilotux.net>
parents: 456
diff changeset
219
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
220 snprintf(buf, sizeof(buf), "%s", timestamp);
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
221 c = buf;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
222
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
223 /* 4 digit year */
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
224 if (!sscanf(c, "%04d", &t.tm_year)) return 0;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
225 c+=4;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
226 if (*c == '-')
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
227 c++;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
228
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
229 t.tm_year -= 1900;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
230
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
231 /* 2 digit month */
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
232 if (!sscanf(c, "%02d", &t.tm_mon)) return 0;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
233 c+=2;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
234 if (*c == '-')
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
235 c++;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
236
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
237 t.tm_mon -= 1;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
238
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
239 /* 2 digit day */
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
240 if (!sscanf(c, "%02d", &t.tm_mday)) return 0;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
241 c+=2;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
242 if (*c == 'T' || *c == '.') { /* we have more than a date, keep going */
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
243 c++; /* skip the "T" */
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
244
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
245 /* 2 digit hour */
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
246 if (sscanf(c, "%02d:%02d:%02d", &t.tm_hour, &t.tm_min, &t.tm_sec) == 3)
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
247 {
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
248 hms_succ = 1;
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
249 c += 8;
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
250 }
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
251 else if (sscanf(c, "%02d%02d%02d", &t.tm_hour, &t.tm_min, &t.tm_sec) == 3)
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
252 {
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
253 hms_succ = 1;
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
254 c += 6;
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
255 }
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
256
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
257 if (hms_succ) {
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
258 int tzhrs, tzmins;
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
259
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
260 if (*c == '.') /* dealing with precision we don't care about */
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
261 c += 4;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
262
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
263 if ((*c == '+' || *c == '-') &&
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
264 sscanf(c+1, "%02d:%02d", &tzhrs, &tzmins)) {
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
265 tzoff = tzhrs*60*60 + tzmins*60;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
266 if (*c == '+')
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
267 tzoff *= -1;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
268 }
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
269
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
270 if (tzoff || utc) {
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
271 #ifdef HAVE_TM_GMTOFF
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
272 tzoff += t.tm_gmtoff;
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
273 #else
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
274 # ifdef HAVE_TIMEZONE
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
275 tzset(); /* making sure */
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
276 tzoff -= timezone;
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
277 # endif
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
278 #endif
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
279 }
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
280 }
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
281 }
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
282
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
283 t.tm_isdst = -1;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
284
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
285 retval = mktime(&t);
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
286
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
287 retval += tzoff;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
288
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
289 return retval;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
290 }
419
2f9852610cf4 Small code review
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
291
2f9852610cf4 Small code review
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
292 // Should only be used for delays < 1s
2f9852610cf4 Small code review
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
293 inline void safe_usleep(unsigned int usec)
2f9852610cf4 Small code review
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
294 {
2f9852610cf4 Small code review
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
295 struct timespec req;
2f9852610cf4 Small code review
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
296 req.tv_sec = 0;
2f9852610cf4 Small code review
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
297 req.tv_nsec = (long)usec * 1000L;
2f9852610cf4 Small code review
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
298 nanosleep(&req, NULL);
2f9852610cf4 Small code review
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
299 }
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
300
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
301 /**
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
302 * Derived from libjabber/jid.c, because the libjabber version is not
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
303 * really convenient for our usage.
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
304 *
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
305 * Check if the full JID is valid
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
306 * Return 0 if it is valid, non zero otherwise
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
307 */
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
308 int check_jid_syntax(char *jid)
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
309 {
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
310 char *str;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
311 char *domain, *resource;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
312 int domlen;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
313
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
314 if (!jid) return 1;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
315
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
316 domain = strchr(jid, '@');
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
317
456
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
318 /* the username is optional */
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
319 if (!domain) {
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
320 domain = jid;
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
321 } else {
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
322 /* node identifiers may not be longer than 1023 bytes */
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
323 if ((domain == jid) || (domain-jid > 1023))
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
324 return 1;
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
325 domain++;
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
326
456
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
327 /* check for low and invalid ascii characters in the username */
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
328 for (str = jid; *str != '@'; str++) {
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
329 if (*str <= 32 || *str == ':' || *str == '@' ||
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
330 *str == '<' || *str == '>' || *str == '\'' ||
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
331 *str == '"' || *str == '&') {
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
332 return 1;
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
333 }
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
334 }
456
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
335 /* the username is okay as far as we can tell without LIBIDN */
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
336 }
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
337
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
338 resource = strchr(domain, '/');
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
339
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
340 /* the resource is optional */
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
341 if (resource) {
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
342 domlen = resource - domain;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
343 resource++;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
344 /* resources may not be longer than 1023 bytes */
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
345 if ((*resource == '\0') || strlen(resource) > 1023)
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
346 return 1;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
347 } else {
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
348 domlen = strlen(domain);
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
349 }
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
350
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
351 /* there must be a domain identifier */
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
352 if (domlen == 0) return 1;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
353
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
354 /* and it must not be longer than 1023 bytes */
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
355 if (domlen > 1023) return 1;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
356
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
357 /* make sure the hostname is valid characters */
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
358 for (str = domain; *str != '\0' && *str != '/'; str++) {
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
359 if (!(isalnum(*str) || *str == '.' || *str == '-' || *str == '_'))
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
360 return 1;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
361 }
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
362
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
363 /* it's okay as far as we can tell without LIBIDN */
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
364 return 0;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
365 }
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
366
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
367
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
368 void mc_strtolower(char *str)
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
369 {
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
370 if (!str) return;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
371 for ( ; *str; str++)
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
372 *str = tolower(*str);
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
373 }
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
374
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
375 // strip_arg_special_chars(string)
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
376 // Remove quotes and backslashes before an escaped quote
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
377 // Only quotes need a backslash
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
378 // Ex.: ["a b"] -> [a b]; [a\"b] -> [a"b]
554
2424bbf0a6db Some more work on do_room()
Mikael Berthe <mikael@lilotux.net>
parents: 553
diff changeset
379 void strip_arg_special_chars(char *s)
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
380 {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
381 int instring = FALSE;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
382 int escape = FALSE;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
383 char *p;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
384
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
385 for (p = s; *p; p++) {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
386 if (*p == '"') {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
387 if (!escape) {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
388 instring = !instring;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
389 strcpy(p, p+1);
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
390 p--;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
391 } else {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
392 escape = FALSE;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
393 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
394 } else if (*p == '\\') {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
395 if (!escape) {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
396 if (*(p+1) == '"') {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
397 strcpy(p, p+1);
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
398 p--;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
399 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
400 escape = TRUE;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
401 } else {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
402 escape = FALSE;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
403 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
404 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
405 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
406 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
407
554
2424bbf0a6db Some more work on do_room()
Mikael Berthe <mikael@lilotux.net>
parents: 553
diff changeset
408 // split_arg(arg, n, preservelast)
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
409 // Split the string arg into a maximum of n pieces, taking care of
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
410 // double quotes.
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
411 // Return a null-terminated array of strings. This array should be freed
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
412 // be the caller after use, for example with free_arg_lst().
559
4eb579399613 Fix a small bug in split_arg()
Mikael Berthe <mikael@lilotux.net>
parents: 556
diff changeset
413 // If dontstriplast is true, the Nth argument isn't stripped (i.e. no
4eb579399613 Fix a small bug in split_arg()
Mikael Berthe <mikael@lilotux.net>
parents: 556
diff changeset
414 // processing of quote chars)
554
2424bbf0a6db Some more work on do_room()
Mikael Berthe <mikael@lilotux.net>
parents: 553
diff changeset
415 char **split_arg(const char *arg, unsigned int n, int dontstriplast)
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
416 {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
417 char **arglst;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
418 const char *p, *start, *end;
735
2f027806cd48 Some code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 727
diff changeset
419 unsigned int i = 0;
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
420 int instring = FALSE;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
421 int escape = FALSE;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
422
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
423 arglst = g_new0(char*, n+1);
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
424
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
425 if (!arg || !n) return arglst;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
426
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
427 // Skip leading space
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
428 for (start = arg; *start && *start == ' '; start++) ;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
429 // End of string pointer
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
430 for (end = start; *end; end++) ;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
431 // Skip trailing space
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
432 while (end > start+1 && *(end-1) == ' ')
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
433 end--;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
434
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
435 for (p = start; p < end; p++) {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
436 if (*p == '"' && !escape)
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
437 instring = !instring;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
438 if (*p == '\\' && !escape)
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
439 escape = TRUE;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
440 else if (escape)
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
441 escape = FALSE;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
442 if (*p == ' ' && !instring && i+1 < n) {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
443 // end of parameter
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
444 *(arglst+i) = g_strndup(start, p-start);
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
445 strip_arg_special_chars(*(arglst+i));
556
c4fee1a2c478 Fix bug in split_arg()
Mikael Berthe <mikael@lilotux.net>
parents: 554
diff changeset
446 for (start = p+1; *start && *start == ' '; start++) ;
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
447 i++;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
448 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
449 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
450
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
451 if (start < end) {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
452 *(arglst+i) = g_strndup(start, end-start);
559
4eb579399613 Fix a small bug in split_arg()
Mikael Berthe <mikael@lilotux.net>
parents: 556
diff changeset
453 if (!dontstriplast || i+1 < n)
554
2424bbf0a6db Some more work on do_room()
Mikael Berthe <mikael@lilotux.net>
parents: 553
diff changeset
454 strip_arg_special_chars(*(arglst+i));
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
455 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
456
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
457 return arglst;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
458 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
459
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
460 // free_arg_lst(arglst)
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
461 // Free an array allocated by split_arg()
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
462 void free_arg_lst(char **arglst)
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
463 {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
464 char **arg_elt;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
465
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
466 for (arg_elt = arglst; *arg_elt; arg_elt++)
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
467 g_free(*arg_elt);
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
468 g_free(arglst);
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
469 }
576
8b3db0b555a1 Add Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 559
diff changeset
470
655
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
471 // replace_nl_with_dots(bufstr)
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
472 // Replace '\n' with "(...)" (or with a NUL if the string is too short)
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
473 void replace_nl_with_dots(char *bufstr)
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
474 {
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
475 char *p = strchr(bufstr, '\n');
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
476 if (p) {
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
477 if (strlen(p) >= 5)
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
478 strcpy(p, "(...)");
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
479 else
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
480 *p = 0;
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
481 }
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
482 }
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
483
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
484 // ut_expand_tabs(text)
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
485 // Expand tabs in string text.
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
486 // If there is no tab in the string, a pointer to text is returned (be
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
487 // careful _not_ to free the pointer in this case).
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
488 // If there are some tabs, a new string with expanded chars is returned; this
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
489 // is up to the caller to free this string after use.
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
490 char *ut_expand_tabs(const char *text)
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
491 {
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
492 char *xtext;
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
493 char *p, *q;
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
494 guint8 n=0;
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
495
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
496 xtext = (char*)text;
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
497 for (p=xtext; *p; p++)
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
498 if (*p == '\t') n++;
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
499
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
500 if (!n)
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
501 return (char*)text;
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
502
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
503 xtext = g_new(char, strlen(text) + 1 + 8*n);
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
504 p = (char*)text;
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
505 q = xtext;
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
506 do {
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
507 if (*p == '\t') {
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
508 do { *q++ = ' '; } while ((q-xtext)%8);
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
509 } else {
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
510 *q++ = *p;
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
511 }
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
512 } while (*p++);
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
513
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
514 return xtext;
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
515 }
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
516
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
517
803
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
518 /* Cygwin's newlib does not have strcasestr() */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
519 /* The author of the code before the endif is
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
520 * Jeffrey Stedfast <fejj@ximian.com>
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
521 * and this code is reusable in compliance with the GPL v2. -- somian */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
522
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
523 #if !defined(HAVE_STRCASESTR)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
524
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
525 # define lowercase(c) (isupper ((int) (c)) ? tolower ((int) (c)) : (int) (c))
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
526 # define bm_index(c, icase) ((icase) ? lowercase (c) : (int) (c))
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
527 # define bm_equal(c1, c2, icase) ((icase) ? lowercase (c1) == lowercase (c2) : (c1) == (c2))
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
528
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
529 /* FIXME: this is just a guess... should really do some performace tests to get an accurate measure */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
530 # define bm_optimal(hlen, nlen) (((hlen) ? (hlen) > 20 : 1) && (nlen) > 10 ? 1 : 0)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
531
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
532 static unsigned char *
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
533 __boyer_moore (const unsigned char *haystack, size_t haystacklen,
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
534 const unsigned char *needle, size_t needlelen, int icase)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
535 {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
536 register unsigned char *hc_ptr, *nc_ptr;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
537 unsigned char *he_ptr, *ne_ptr, *h_ptr;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
538 size_t skiptable[256], n;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
539 register int i;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
540
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
541 #ifdef BOYER_MOORE_CHECKS
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
542 /* we don't need to do these checks since memmem/strstr/etc do it already */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
543 /* if the haystack is shorter than the needle then we can't possibly match */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
544 if (haystacklen < needlelen)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
545 return NULL;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
546
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
547 /* instant match if the pattern buffer is 0-length */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
548 if (needlelen == 0)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
549 return (unsigned char *) haystack;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
550 #endif /* BOYER_MOORE_CHECKS */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
551
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
552 /* set a pointer at the end of each string */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
553 ne_ptr = (unsigned char *) needle + needlelen - 1;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
554 he_ptr = (unsigned char *) haystack + haystacklen - 1;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
555
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
556 /* create our skip table */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
557 for (i = 0; i < 256; i++)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
558 skiptable[i] = needlelen;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
559 for (nc_ptr = (unsigned char *) needle; nc_ptr < ne_ptr; nc_ptr++)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
560 skiptable[bm_index (*nc_ptr, icase)] = (size_t) (ne_ptr - nc_ptr);
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
561
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
562 h_ptr = (unsigned char *) haystack;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
563 while (haystacklen >= needlelen) {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
564 hc_ptr = h_ptr + needlelen - 1; /* set the haystack compare pointer */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
565 nc_ptr = ne_ptr; /* set the needle compare pointer */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
566
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
567 /* work our way backwards till they don't match */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
568 for (i = 0; nc_ptr > (unsigned char *) needle; nc_ptr--, hc_ptr--, i++)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
569 if (!bm_equal (*nc_ptr, *hc_ptr, icase))
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
570 break;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
571
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
572 if (!bm_equal (*nc_ptr, *hc_ptr, icase)) {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
573 n = skiptable[bm_index (*hc_ptr, icase)];
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
574 if (n == needlelen && i)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
575 if (bm_equal (*ne_ptr, ((unsigned char *) needle)[0], icase))
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
576 n--;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
577 h_ptr += n;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
578 haystacklen -= n;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
579 } else
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
580 return (unsigned char *) h_ptr;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
581 }
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
582
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
583 return NULL;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
584 }
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
585
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
586 /*
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
587 * strcasestr:
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
588 * @haystack: string to search
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
589 * @needle: substring to search for
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
590 *
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
591 * Finds the first occurence of the substring @needle within the
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
592 * string @haystack ignoring case.
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
593 *
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
594 * Returns a pointer to the beginning of the substring match within
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
595 * @haystack, or NULL if the substring is not found.
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
596 **/
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
597 char *
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
598 strcasestr (const char *haystack, const char *needle)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
599 {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
600 register unsigned char *h, *n, *hc, *nc;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
601 size_t needlelen;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
602
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
603 needlelen = strlen (needle);
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
604
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
605 if (needlelen == 0) {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
606 return (char *) haystack;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
607 } else if (bm_optimal (0, needlelen)) {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
608 return (char *) __boyer_moore ((const unsigned char *) haystack,
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
609 strlen (haystack),
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
610 (const unsigned char *) needle,
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
611 needlelen, 1);
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
612 }
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
613
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
614 h = (unsigned char *) haystack;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
615 n = (unsigned char *) needle;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
616
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
617 while (*(h + needlelen - 1)) {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
618 if (lowercase (*h) == lowercase (*n)) {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
619 for (hc = h + 1, nc = n + 1; *hc && *nc; hc++, nc++)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
620 if (lowercase (*hc) != lowercase (*nc))
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
621 break;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
622
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
623 if (!*nc)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
624 return (char *) h;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
625 }
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
626 h++;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
627 }
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
628 return NULL;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
629 }
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
630 #endif /* !HAVE_STRCASESTR */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
631
580
fed6d1e4d7a9 Fix modelines
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
632 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */