ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/misc.C
(Generate patch)

Comparing rxvt-unicode/src/misc.C (file contents):
Revision 1.6 by pcg, Mon Feb 9 07:11:49 2004 UTC vs.
Revision 1.7 by pcg, Fri Feb 13 12:16:21 2004 UTC

33 return str ? strdup (str) : 0; 33 return str ? strdup (str) : 0;
34} 34}
35 35
36/* EXTPROTO */ 36/* EXTPROTO */
37char * 37char *
38rxvt_r_basename(const char *str) 38rxvt_r_basename (const char *str)
39{ 39{
40 char *base = STRRCHR(str, '/'); 40 char *base = STRRCHR (str, '/');
41 41
42 return (char *)(base ? base + 1 : str); 42 return (char *) (base ? base + 1 : str);
43} 43}
44 44
45/* 45/*
46 * Print an error message 46 * Print an error message
47 */ 47 */
48/* EXTPROTO */ 48/* EXTPROTO */
49void 49void
50rxvt_print_error(const char *fmt,...) 50rxvt_print_error (const char *fmt,...)
51{ 51{
52 va_list arg_ptr; 52 va_list arg_ptr;
53 53
54 va_start(arg_ptr, fmt); 54 va_start (arg_ptr, fmt);
55 fprintf(stderr, APL_NAME ": "); 55 fprintf (stderr, APL_NAME ": ");
56 vfprintf(stderr, fmt, arg_ptr); 56 vfprintf (stderr, fmt, arg_ptr);
57 fprintf(stderr, "\n"); 57 fprintf (stderr, "\n");
58 va_end(arg_ptr); 58 va_end (arg_ptr);
59} 59}
60 60
61/* 61/*
62 * check that the first characters of S1 match S2 62 * check that the first characters of S1 match S2
63 * 63 *
66 * Match 66 * Match
67 * return: STRLEN (S2) 67 * return: STRLEN (S2)
68 */ 68 */
69/* EXTPROTO */ 69/* EXTPROTO */
70int 70int
71rxvt_Str_match(const char *s1, const char *s2) 71rxvt_Str_match (const char *s1, const char *s2)
72{ 72{
73 int n = STRLEN(s2); 73 int n = STRLEN (s2);
74 74
75 return ((STRNCMP(s1, s2, n) == 0) ? n : 0); 75 return ((STRNCMP (s1, s2, n) == 0) ? n : 0);
76} 76}
77 77
78/* EXTPROTO */ 78/* EXTPROTO */
79const char * 79const char *
80rxvt_Str_skip_space(const char *str) 80rxvt_Str_skip_space (const char *str)
81{ 81{
82 if (str) 82 if (str)
83 while (*str && isspace(*str)) 83 while (*str && isspace (*str))
84 str++; 84 str++;
85 return str; 85 return str;
86} 86}
87 87
88/* 88/*
89 * remove leading/trailing space and strip-off leading/trailing quotes. 89 * remove leading/trailing space and strip-off leading/trailing quotes.
90 * in place. 90 * in place.
91 */ 91 */
92/* EXTPROTO */ 92/* EXTPROTO */
93char * 93char *
94rxvt_Str_trim(char *str) 94rxvt_Str_trim (char *str)
95{ 95{
96 char *r, *s; 96 char *r, *s;
97 int n; 97 int n;
98 98
99 if (!str || !*str) /* shortcut */ 99 if (!str || !*str) /* shortcut */
100 return str; 100 return str;
101 101
102 /* skip leading spaces */ 102 /* skip leading spaces */
103 for (s = str; *s && isspace(*s); s++) ; 103 for (s = str; *s && isspace (*s); s++) ;
104 /* goto end of string */ 104 /* goto end of string */
105 for (n = 0, r = s; *r++; n++) ; 105 for (n = 0, r = s; *r++; n++) ;
106 r -= 2; 106 r -= 2;
107 /* dump return */ 107 /* dump return */
108 if (n > 0 && *r == '\n') 108 if (n > 0 && *r == '\n')
109 n--, r--; 109 n--, r--;
110 /* backtrack along trailing spaces */ 110 /* backtrack along trailing spaces */
111 for (; n > 0 && isspace(*r); r--, n--) ; 111 for (; n > 0 && isspace (*r); r--, n--) ;
112 /* skip matching leading/trailing quotes */ 112 /* skip matching leading/trailing quotes */
113 if (*s == '"' && *r == '"' && n > 1) 113 if (*s == '"' && *r == '"' && n > 1)
114 { 114 {
115 s++; 115 s++;
116 n -= 2; 116 n -= 2;
137 * 137 *
138 * returns the converted string length 138 * returns the converted string length
139 */ 139 */
140/* EXTPROTO */ 140/* EXTPROTO */
141int 141int
142rxvt_Str_escaped(char *str) 142rxvt_Str_escaped (char *str)
143{ 143{
144 char ch, *s, *d; 144 char ch, *s, *d;
145 int i, num, append = 0; 145 int i, num, append = 0;
146 146
147 if (!str || !*str) 147 if (!str || !*str)
152 if (*s == 'M' && s[1] == '-') 152 if (*s == 'M' && s[1] == '-')
153 { 153 {
154 /* Emacs convenience, replace leading `M-..' with `\E..' */ 154 /* Emacs convenience, replace leading `M-..' with `\E..' */
155 *d++ = C0_ESC; 155 *d++ = C0_ESC;
156 s += 2; 156 s += 2;
157 if (toupper(*s) == 'X') 157 if (toupper (*s) == 'X')
158 /* append carriage-return for `M-xcommand' */ 158 /* append carriage-return for `M-xcommand' */
159 for (*d++ = 'x', append = '\r', s++; isspace(*s); s++) ; 159 for (*d++ = 'x', append = '\r', s++; isspace (*s); s++) ;
160 } 160 }
161 for (; (ch = *s++);) 161 for (; (ch = *s++);)
162 { 162 {
163 if (ch == '\\') 163 if (ch == '\\')
164 { 164 {
189 ch = C0_HT; /* tab */ 189 ch = C0_HT; /* tab */
190 } 190 }
191 else if (ch == '^') 191 else if (ch == '^')
192 { 192 {
193 ch = *s++; 193 ch = *s++;
194 ch = toupper(ch); 194 ch = toupper (ch);
195 ch = (ch == '?' ? 127 : (ch - '@')); 195 ch = (ch == '?' ? 127 : (ch - '@'));
196 } 196 }
197 *d++ = ch; 197 *d++ = ch;
198 } 198 }
199 199
215 * are properly returned 215 * are properly returned
216 * Caller should free each entry and array when done 216 * Caller should free each entry and array when done
217 */ 217 */
218/* EXTPROTO */ 218/* EXTPROTO */
219char ** 219char **
220rxvt_splitcommastring(const char *cs) 220rxvt_splitcommastring (const char *cs)
221{ 221{
222 int l, n, p; 222 int l, n, p;
223 const char *s, *t; 223 const char *s, *t;
224 char **ret; 224 char **ret;
225 225
227 s = ""; 227 s = "";
228 228
229 for (n = 1, t = s; *t; t++) 229 for (n = 1, t = s; *t; t++)
230 if (*t == ',') 230 if (*t == ',')
231 n++; 231 n++;
232 ret = (char **)malloc((n + 1) * sizeof(char *)); 232 ret = (char **)malloc ((n + 1) * sizeof (char *));
233 ret[n] = NULL; 233 ret[n] = NULL;
234 234
235 for (l = 0, t = s; l < n; l++) 235 for (l = 0, t = s; l < n; l++)
236 { 236 {
237 for ( ; *t && *t != ','; t++) ; 237 for ( ; *t && *t != ','; t++) ;
238 p = t - s; 238 p = t - s;
239 ret[l] = (char *)malloc(p + 1); 239 ret[l] = (char *)malloc (p + 1);
240 strncpy(ret[l], s, p); 240 strncpy (ret[l], s, p);
241 ret[l][p] = '\0'; 241 ret[l][p] = '\0';
242 rxvt_Str_trim(ret[l]); 242 rxvt_Str_trim (ret[l]);
243 s = ++t; 243 s = ++t;
244 } 244 }
245 return ret; 245 return ret;
246} 246}
247 247
258 * 258 *
259 * FILE is either semi-colon or zero terminated 259 * FILE is either semi-colon or zero terminated
260 */ 260 */
261/* INTPROTO */ 261/* INTPROTO */
262char * 262char *
263rxvt_File_search_path(const char *pathlist, const char *file, const char *ext) 263rxvt_File_search_path (const char *pathlist, const char *file, const char *ext)
264{ 264{
265 int maxpath, len; 265 int maxpath, len;
266 const char *p, *path; 266 const char *p, *path;
267 char name[256]; 267 char name[256];
268 268
269 if (!access(file, R_OK)) /* found (plain name) in current directory */ 269 if (!access (file, R_OK)) /* found (plain name) in current directory */
270 return STRDUP(file); 270 return STRDUP (file);
271 271
272 /* semi-colon delimited */ 272 /* semi-colon delimited */
273 if ((p = STRCHR(file, ';'))) 273 if ((p = STRCHR (file, ';')))
274 len = (p - file); 274 len = (p - file);
275 else 275 else
276 len = STRLEN(file); 276 len = STRLEN (file);
277 277
278#ifdef DEBUG_SEARCH_PATH 278#ifdef DEBUG_SEARCH_PATH
279 getcwd(name, sizeof(name)); 279 getcwd (name, sizeof (name));
280 fprintf(stderr, "pwd: \"%s\"\n", name); 280 fprintf (stderr, "pwd: \"%s\"\n", name);
281 fprintf(stderr, "find: \"%.*s\"\n", len, file); 281 fprintf (stderr, "find: \"%.*s\"\n", len, file);
282#endif 282#endif
283 283
284 /* leave room for an extra '/' and trailing '\0' */ 284 /* leave room for an extra '/' and trailing '\0' */
285 maxpath = sizeof(name) - (len + (ext ? STRLEN(ext) : 0) + 2); 285 maxpath = sizeof (name) - (len + (ext ? STRLEN (ext) : 0) + 2);
286 if (maxpath <= 0) 286 if (maxpath <= 0)
287 return NULL; 287 return NULL;
288 288
289 /* check if we can find it now */ 289 /* check if we can find it now */
290 STRNCPY(name, file, len); 290 STRNCPY (name, file, len);
291 name[len] = '\0'; 291 name[len] = '\0';
292 292
293 if (!access(name, R_OK)) 293 if (!access (name, R_OK))
294 return STRDUP(name); 294 return STRDUP (name);
295 if (ext) 295 if (ext)
296 { 296 {
297 STRCAT(name, ext); 297 STRCAT (name, ext);
298 if (!access(name, R_OK)) 298 if (!access (name, R_OK))
299 return STRDUP(name); 299 return STRDUP (name);
300 } 300 }
301 for (path = pathlist; path != NULL && *path != '\0'; path = p) 301 for (path = pathlist; path != NULL && *path != '\0'; path = p)
302 { 302 {
303 int n; 303 int n;
304 304
305 /* colon delimited */ 305 /* colon delimited */
306 if ((p = STRCHR(path, ':')) == NULL) 306 if ((p = STRCHR (path, ':')) == NULL)
307 p = STRCHR(path, '\0'); 307 p = STRCHR (path, '\0');
308 308
309 n = (p - path); 309 n = (p - path);
310 if (*p != '\0') 310 if (*p != '\0')
311 p++; 311 p++;
312 312
313 if (n > 0 && n <= maxpath) 313 if (n > 0 && n <= maxpath)
314 { 314 {
315 STRNCPY(name, path, n); 315 STRNCPY (name, path, n);
316 if (name[n - 1] != '/') 316 if (name[n - 1] != '/')
317 name[n++] = '/'; 317 name[n++] = '/';
318 name[n] = '\0'; 318 name[n] = '\0';
319 STRNCAT(name, file, len); 319 STRNCAT (name, file, len);
320 320
321 if (!access(name, R_OK)) 321 if (!access (name, R_OK))
322 return STRDUP(name); 322 return STRDUP (name);
323 if (ext) 323 if (ext)
324 { 324 {
325 STRCAT(name, ext); 325 STRCAT (name, ext);
326 if (!access(name, R_OK)) 326 if (!access (name, R_OK))
327 return STRDUP(name); 327 return STRDUP (name);
328 } 328 }
329 } 329 }
330 } 330 }
331 return NULL; 331 return NULL;
332} 332}
333 333
334/* EXTPROTO */ 334/* EXTPROTO */
335char * 335char *
336rxvt_File_find(const char *file, const char *ext, const char *path) 336rxvt_File_find (const char *file, const char *ext, const char *path)
337{ 337{
338 char *f; 338 char *f;
339 339
340 if (file == NULL || *file == '\0') 340 if (file == NULL || *file == '\0')
341 return NULL; 341 return NULL;
342 342
343 /* search environment variables here too */ 343 /* search environment variables here too */
344 if ((f = rxvt_File_search_path(path, file, ext)) == NULL) 344 if ((f = rxvt_File_search_path (path, file, ext)) == NULL)
345#ifdef PATH_ENV 345#ifdef PATH_ENV
346 if ((f = rxvt_File_search_path(getenv(PATH_ENV), file, ext)) == NULL) 346 if ((f = rxvt_File_search_path (getenv (PATH_ENV), file, ext)) == NULL)
347#endif 347#endif
348 f = rxvt_File_search_path(getenv("PATH"), file, ext); 348 f = rxvt_File_search_path (getenv ("PATH"), file, ext);
349 349
350#ifdef DEBUG_SEARCH_PATH 350#ifdef DEBUG_SEARCH_PATH
351 if (f) 351 if (f)
352 fprintf(stderr, "found: \"%s\"\n", f); 352 fprintf (stderr, "found: \"%s\"\n", f);
353#endif 353#endif
354 354
355 return f; 355 return f;
356} 356}
357#endif /* defined (XPM_BACKGROUND) || (MENUBAR_MAX) */ 357#endif /* defined (XPM_BACKGROUND) || (MENUBAR_MAX) */
364 * Draw top/left and bottom/right border shadows around windows 364 * Draw top/left and bottom/right border shadows around windows
365 */ 365 */
366#if defined(RXVT_SCROLLBAR) || defined(MENUBAR) 366#if defined(RXVT_SCROLLBAR) || defined(MENUBAR)
367/* EXTPROTO */ 367/* EXTPROTO */
368void 368void
369rxvt_Draw_Shadow(Display *display, Window win, GC topShadow, GC botShadow, int x, int y, int w, int h) 369rxvt_Draw_Shadow (Display *display, Window win, GC topShadow, GC botShadow, int x, int y, int w, int h)
370{ 370{
371 int shadow; 371 int shadow;
372 372
373 shadow = (w == 0 || h == 0) ? 1 : SHADOW; 373 shadow = (w == 0 || h == 0) ? 1 : SHADOW;
374 w += x - 1; 374 w += x - 1;
375 h += y - 1; 375 h += y - 1;
376 for (; shadow-- > 0; x++, y++, w--, h--) 376 for (; shadow-- > 0; x++, y++, w--, h--)
377 { 377 {
378 XDrawLine(display, win, topShadow, x, y, w, y); 378 XDrawLine (display, win, topShadow, x, y, w, y);
379 XDrawLine(display, win, topShadow, x, y, x, h); 379 XDrawLine (display, win, topShadow, x, y, x, h);
380 XDrawLine(display, win, botShadow, w, h, w, y + 1); 380 XDrawLine (display, win, botShadow, w, h, w, y + 1);
381 XDrawLine(display, win, botShadow, w, h, x + 1, h); 381 XDrawLine (display, win, botShadow, w, h, x + 1, h);
382 } 382 }
383} 383}
384#endif 384#endif
385 385
386/* button shapes */ 386/* button shapes */
387#ifdef MENUBAR 387#ifdef MENUBAR
388/* EXTPROTO */ 388/* EXTPROTO */
389void 389void
390rxvt_Draw_Triangle(Display *display, Window win, GC topShadow, GC botShadow, int x, int y, int w, int type) 390rxvt_Draw_Triangle (Display *display, Window win, GC topShadow, GC botShadow, int x, int y, int w, int type)
391{ 391{
392 switch (type) 392 switch (type)
393 { 393 {
394 case 'r': /* right triangle */ 394 case 'r': /* right triangle */
395 XDrawLine(display, win, topShadow, x, y, x, y + w); 395 XDrawLine (display, win, topShadow, x, y, x, y + w);
396 XDrawLine(display, win, topShadow, x, y, x + w, y + w / 2); 396 XDrawLine (display, win, topShadow, x, y, x + w, y + w / 2);
397 XDrawLine(display, win, botShadow, x, y + w, x + w, y + w / 2); 397 XDrawLine (display, win, botShadow, x, y + w, x + w, y + w / 2);
398 break; 398 break;
399 399
400 case 'l': /* left triangle */ 400 case 'l': /* left triangle */
401 XDrawLine(display, win, botShadow, x + w, y + w, x + w, y); 401 XDrawLine (display, win, botShadow, x + w, y + w, x + w, y);
402 XDrawLine(display, win, botShadow, x + w, y + w, x, y + w / 2); 402 XDrawLine (display, win, botShadow, x + w, y + w, x, y + w / 2);
403 XDrawLine(display, win, topShadow, x, y + w / 2, x + w, y); 403 XDrawLine (display, win, topShadow, x, y + w / 2, x + w, y);
404 break; 404 break;
405 405
406 case 'd': /* down triangle */ 406 case 'd': /* down triangle */
407 XDrawLine(display, win, topShadow, x, y, x + w / 2, y + w); 407 XDrawLine (display, win, topShadow, x, y, x + w / 2, y + w);
408 XDrawLine(display, win, topShadow, x, y, x + w, y); 408 XDrawLine (display, win, topShadow, x, y, x + w, y);
409 XDrawLine(display, win, botShadow, x + w, y, x + w / 2, y + w); 409 XDrawLine (display, win, botShadow, x + w, y, x + w / 2, y + w);
410 break; 410 break;
411 411
412 case 'u': /* up triangle */ 412 case 'u': /* up triangle */
413 XDrawLine(display, win, botShadow, x + w, y + w, x + w / 2, y); 413 XDrawLine (display, win, botShadow, x + w, y + w, x + w / 2, y);
414 XDrawLine(display, win, botShadow, x + w, y + w, x, y + w); 414 XDrawLine (display, win, botShadow, x + w, y + w, x, y + w);
415 XDrawLine(display, win, topShadow, x, y + w, x + w / 2, y); 415 XDrawLine (display, win, topShadow, x, y + w, x + w / 2, y);
416 break; 416 break;
417#if 0 417#if 0
418 case 's': /* square */ 418 case 's': /* square */
419 XDrawLine(display, win, topShadow, x + w, y, x, y); 419 XDrawLine (display, win, topShadow, x + w, y, x, y);
420 XDrawLine(display, win, topShadow, x, y, x, y + w); 420 XDrawLine (display, win, topShadow, x, y, x, y + w);
421 XDrawLine(display, win, botShadow, x, y + w, x + w, y + w); 421 XDrawLine (display, win, botShadow, x, y + w, x + w, y + w);
422 XDrawLine(display, win, botShadow, x + w, y + w, x + w, y); 422 XDrawLine (display, win, botShadow, x + w, y + w, x + w, y);
423 break; 423 break;
424#endif 424#endif
425 425
426 } 426 }
427} 427}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines