Mercurial > ~mikael > mcabber > hg
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 |
rev | line source |
---|---|
241 | 1 /* |
2 * utils.c -- Various utility functions | |
393 | 3 * |
699 | 4 * Copyright (C) 2005, 2006 Mikael Berthe <bmikael@lists.lilotux.net> |
241 | 5 * ut_* functions are derived from Cabber debug/log code. |
6 * from_iso8601() comes from the Gaim project. | |
7 * | |
8 * This program is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or (at | |
11 * your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, but | |
14 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | |
21 * USA | |
22 */ | |
23 | |
24 | 24 #include <stdio.h> |
25 #include <stdlib.h> | |
77 | 26 #include <string.h> |
24 | 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 | 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 | 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 | 40 |
241 | 41 #include <config.h> |
378
2e6c7b1440d1
Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents:
374
diff
changeset
|
42 #include "logprint.h" |
241 | 43 |
76 | 44 static int DebugEnabled; |
77 | 45 static char *FName; |
24 | 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 | 48 { |
77 | 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 | 52 |
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset
|
53 if (level < 1) { |
138 | 54 DebugEnabled = 0; |
55 FName = NULL; | |
56 return; | |
57 } | |
58 | |
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 | 61 else { |
138 | 62 FName = getenv("HOME"); |
63 if (!FName) | |
64 FName = "/tmp/mcabberlog"; | |
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 | 67 strcpy(tmpname, FName); |
68 strcat(tmpname, "/mcabberlog"); | |
69 FName = tmpname; | |
70 } | |
77 | 71 } |
24 | 72 |
73 DebugEnabled = level; | |
76 | 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 | 97 fclose(fp); |
98 } | |
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 | 101 { |
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset
|
102 if (!DebugEnabled || !FName) return; |
393 | 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 | 112 fclose(fp); |
113 } | |
114 } | |
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 | 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 | 182 // to_iso8601(dststr, timestamp) |
183 // Convert timestamp to iso8601 format, and store it in dststr. | |
184 // NOTE: dststr should be at last 19 chars long. | |
185 // Return should be 0 | |
186 int to_iso8601(char *dststr, time_t timestamp) | |
187 { | |
188 struct tm *tm_time; | |
189 int ret; | |
190 | |
191 tm_time = gmtime(×tamp); | |
192 | |
193 ret = snprintf(dststr, 19, "%.4d%02d%02dT%02d:%02d:%02dZ", | |
194 1900+tm_time->tm_year, tm_time->tm_mon+1, tm_time->tm_mday, | |
195 tm_time->tm_hour, tm_time->tm_min, tm_time->tm_sec); | |
196 | |
197 return ((ret == -1) ? -1 : 0); | |
198 } | |
199 | |
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 | 202 // (Actually date may not be pure iso-8601) |
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 | 205 time_t from_iso8601(const char *timestamp, int utc) |
206 { | |
207 struct tm t; | |
208 time_t retval = 0; | |
209 char buf[32]; | |
210 char *c; | |
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 | 213 |
214 time(&retval); | |
215 localtime_r(&retval, &t); | |
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 | 220 snprintf(buf, sizeof(buf), "%s", timestamp); |
221 c = buf; | |
222 | |
223 /* 4 digit year */ | |
224 if (!sscanf(c, "%04d", &t.tm_year)) return 0; | |
225 c+=4; | |
226 if (*c == '-') | |
227 c++; | |
228 | |
229 t.tm_year -= 1900; | |
230 | |
231 /* 2 digit month */ | |
232 if (!sscanf(c, "%02d", &t.tm_mon)) return 0; | |
233 c+=2; | |
234 if (*c == '-') | |
235 c++; | |
236 | |
237 t.tm_mon -= 1; | |
238 | |
239 /* 2 digit day */ | |
240 if (!sscanf(c, "%02d", &t.tm_mday)) return 0; | |
241 c+=2; | |
242 if (*c == 'T' || *c == '.') { /* we have more than a date, keep going */ | |
243 c++; /* skip the "T" */ | |
244 | |
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 | 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 | 260 if (*c == '.') /* dealing with precision we don't care about */ |
261 c += 4; | |
262 | |
263 if ((*c == '+' || *c == '-') && | |
264 sscanf(c+1, "%02d:%02d", &tzhrs, &tzmins)) { | |
265 tzoff = tzhrs*60*60 + tzmins*60; | |
266 if (*c == '+') | |
267 tzoff *= -1; | |
268 } | |
269 | |
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 | 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 | 279 } |
280 } | |
281 } | |
282 | |
283 t.tm_isdst = -1; | |
284 | |
285 retval = mktime(&t); | |
286 | |
287 retval += tzoff; | |
288 | |
289 return retval; | |
290 } | |
419 | 291 |
292 // Should only be used for delays < 1s | |
293 inline void safe_usleep(unsigned int usec) | |
294 { | |
295 struct timespec req; | |
296 req.tv_sec = 0; | |
297 req.tv_nsec = (long)usec * 1000L; | |
298 nanosleep(&req, NULL); | |
299 } | |
452 | 300 |
301 /** | |
302 * Derived from libjabber/jid.c, because the libjabber version is not | |
303 * really convenient for our usage. | |
304 * | |
305 * Check if the full JID is valid | |
306 * Return 0 if it is valid, non zero otherwise | |
307 */ | |
308 int check_jid_syntax(char *jid) | |
309 { | |
310 char *str; | |
311 char *domain, *resource; | |
312 int domlen; | |
313 | |
314 if (!jid) return 1; | |
315 | |
316 domain = strchr(jid, '@'); | |
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 | 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 | 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 | 336 } |
337 | |
338 resource = strchr(domain, '/'); | |
339 | |
340 /* the resource is optional */ | |
341 if (resource) { | |
342 domlen = resource - domain; | |
343 resource++; | |
344 /* resources may not be longer than 1023 bytes */ | |
345 if ((*resource == '\0') || strlen(resource) > 1023) | |
346 return 1; | |
347 } else { | |
348 domlen = strlen(domain); | |
349 } | |
350 | |
351 /* there must be a domain identifier */ | |
352 if (domlen == 0) return 1; | |
353 | |
354 /* and it must not be longer than 1023 bytes */ | |
355 if (domlen > 1023) return 1; | |
356 | |
357 /* make sure the hostname is valid characters */ | |
358 for (str = domain; *str != '\0' && *str != '/'; str++) { | |
359 if (!(isalnum(*str) || *str == '.' || *str == '-' || *str == '_')) | |
360 return 1; | |
361 } | |
362 | |
363 /* it's okay as far as we can tell without LIBIDN */ | |
364 return 0; | |
365 } | |
366 | |
551
c71699efa5cc
Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents:
524
diff
changeset
|
367 |
452 | 368 void mc_strtolower(char *str) |
369 { | |
370 if (!str) return; | |
371 for ( ; *str; str++) | |
372 *str = tolower(*str); | |
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 | 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 | 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 | 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 | 632 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ |