summaryrefslogtreecommitdiffabout
path: root/shared.c
authorLars Hjemli <hjemli@gmail.com>2010-07-18 13:03:08 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2010-07-18 13:03:08 (UTC)
commit5c5d189635287a3bfaa1a4aef133dc0c582a27c2 (patch) (unidiff)
treecf14b0a5578c9d23a560690e7e256260633ce043 /shared.c
parent60fcf600f5010701c20b63867999a802ca0e05c0 (diff)
parentba56a37e863d0f90e3e953047486905cfb959925 (diff)
downloadcgit-5c5d189635287a3bfaa1a4aef133dc0c582a27c2.zip
cgit-5c5d189635287a3bfaa1a4aef133dc0c582a27c2.tar.gz
cgit-5c5d189635287a3bfaa1a4aef133dc0c582a27c2.tar.bz2
Merge branch 'lh/macros'
Diffstat (limited to 'shared.c') (more/less context) (ignore whitespace changes)
-rw-r--r--shared.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/shared.c b/shared.c
index 06f70bb..9f7d6a5 100644
--- a/shared.c
+++ b/shared.c
@@ -432,3 +432,74 @@ int readfile(const char *path, char **buf, size_t *size)
432 close(fd); 432 close(fd);
433 return (*size == st.st_size ? 0 : e); 433 return (*size == st.st_size ? 0 : e);
434} 434}
435
436int is_token_char(char c)
437{
438 return isalnum(c) || c == '_';
439}
440
441/* Replace name with getenv(name), return pointer to zero-terminating char
442 */
443char *expand_macro(char *name, int maxlength)
444{
445 char *value;
446 int len;
447
448 len = 0;
449 value = getenv(name);
450 if (value) {
451 len = strlen(value);
452 if (len > maxlength)
453 len = maxlength;
454 strncpy(name, value, len);
455 }
456 return name + len;
457}
458
459#define EXPBUFSIZE (1024 * 8)
460
461/* Replace all tokens prefixed by '$' in the specified text with the
462 * value of the named environment variable.
463 * NB: the return value is a static buffer, i.e. it must be strdup'd
464 * by the caller.
465 */
466char *expand_macros(const char *txt)
467{
468 static char result[EXPBUFSIZE];
469 char *p, *start;
470 int len;
471
472 p = result;
473 start = NULL;
474 while (p < result + EXPBUFSIZE - 1 && txt && *txt) {
475 *p = *txt;
476 if (start) {
477 if (!is_token_char(*txt)) {
478 if (p - start > 0) {
479 *p = '\0';
480 len = result + EXPBUFSIZE - start - 1;
481 p = expand_macro(start, len) - 1;
482 }
483 start = NULL;
484 txt--;
485 }
486 p++;
487 txt++;
488 continue;
489 }
490 if (*txt == '$') {
491 start = p;
492 txt++;
493 continue;
494 }
495 p++;
496 txt++;
497 }
498 *p = '\0';
499 if (start && p - start > 0) {
500 len = result + EXPBUFSIZE - start - 1;
501 p = expand_macro(start, len);
502 *p = '\0';
503 }
504 return result;
505}