summaryrefslogtreecommitdiff
path: root/jam-files/engine/subst.c
diff options
context:
space:
mode:
authorChris Dyer <cdyer@cs.cmu.edu>2012-10-11 14:06:32 -0400
committerChris Dyer <cdyer@cs.cmu.edu>2012-10-11 14:06:32 -0400
commit9339c80d465545aec5a6dccfef7c83ca715bf11f (patch)
tree64c56d558331edad1db3832018c80e799551c39a /jam-files/engine/subst.c
parent438dac41810b7c69fa10203ac5130d20efa2da9f (diff)
parentafd7da3b2338661657ad0c4e9eec681e014d37bf (diff)
Merge branch 'master' of https://github.com/redpony/cdec
Diffstat (limited to 'jam-files/engine/subst.c')
-rw-r--r--jam-files/engine/subst.c94
1 files changed, 0 insertions, 94 deletions
diff --git a/jam-files/engine/subst.c b/jam-files/engine/subst.c
deleted file mode 100644
index 75524ecc..00000000
--- a/jam-files/engine/subst.c
+++ /dev/null
@@ -1,94 +0,0 @@
-#include <stddef.h>
-#include "jam.h"
-#include "regexp.h"
-#include "hash.h"
-
-#include "newstr.h"
-#include "lists.h"
-#include "parse.h"
-#include "compile.h"
-#include "frames.h"
-
-struct regex_entry
-{
- const char* pattern;
- regexp* regex;
-};
-typedef struct regex_entry regex_entry;
-
-static struct hash* regex_hash;
-
-regexp* regex_compile( const char* pattern )
-{
- regex_entry entry, *e = &entry;
- entry.pattern = pattern;
-
- if ( !regex_hash )
- regex_hash = hashinit(sizeof(regex_entry), "regex");
-
- if ( hashenter( regex_hash, (HASHDATA **)&e ) )
- e->regex = regcomp( (char*)pattern );
-
- return e->regex;
-}
-
-LIST*
-builtin_subst(
- PARSE *parse,
- FRAME *frame )
-{
- LIST* result = L0;
- LIST* arg1 = lol_get( frame->args, 0 );
-
- if ( arg1 && list_next(arg1) && list_next(list_next(arg1)) )
- {
-
- const char* source = arg1->string;
- const char* pattern = list_next(arg1)->string;
- regexp* repat = regex_compile( pattern );
-
- if ( regexec( repat, (char*)source) )
- {
- LIST* subst = list_next(arg1);
-
- while ((subst = list_next(subst)) != L0)
- {
-# define BUFLEN 4096
- char buf[BUFLEN + 1];
- const char* in = subst->string;
- char* out = buf;
-
- for ( in = subst->string; *in && out < buf + BUFLEN; ++in )
- {
- if ( *in == '\\' || *in == '$' )
- {
- ++in;
- if ( *in == 0 )
- {
- break;
- }
- else if ( *in >= '0' && *in <= '9' )
- {
- unsigned n = *in - '0';
- const size_t srclen = repat->endp[n] - repat->startp[n];
- const size_t remaining = buf + BUFLEN - out;
- const size_t len = srclen < remaining ? srclen : remaining;
- memcpy( out, repat->startp[n], len );
- out += len;
- continue;
- }
- /* fall through and copy the next character */
- }
- *out++ = *in;
- }
- *out = 0;
-
- result = list_new( result, newstr( buf ) );
-#undef BUFLEN
- }
- }
- }
-
- return result;
-}
-