Browse Source

string templating possibly working

master
mort 8 years ago
parent
commit
b6d25fee71
5 changed files with 46 additions and 21 deletions
  1. 2
    2
      Makefile
  2. 1
    0
      src/cms_build.c
  3. 0
    3
      src/cms_err.c
  4. 42
    15
      src/cms_template.c
  5. 1
    1
      src/cms_template.h

+ 2
- 2
Makefile View File

appname = housecat appname = housecat


build: build:
gcc -O3 -o $(appname) src/*.c -std=c99 -D_XOPEN_SOURCE=700
gcc -o $(appname) -O3 src/*.c -std=c99 -D_XOPEN_SOURCE=700


debug: debug:
gcc -o $(appname) src/*.c -std=c99 -DDEBUG=1 -D_XOPEN_SOURCE=700
gcc -o $(appname) -Wall -Wextra src/*.c -std=c99 -DDEBUG=1 -D_XOPEN_SOURCE=700


install: install:
mv $(appname) /usr/bin/$(appname) mv $(appname) /usr/bin/$(appname)

+ 1
- 0
src/cms_build.c View File

#include <string.h> #include <string.h>


#include "cms_build.h" #include "cms_build.h"
#include "cms_template.h"
#include "cms_err.h" #include "cms_err.h"
#include "cms_files.h" #include "cms_files.h"
#include "cms_util.h" #include "cms_util.h"

+ 0
- 3
src/cms_err.c View File

#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <errno.h> #include <errno.h>
#ifdef DEBUG
#include <error.h>
#endif


#include "cms_err.h" #include "cms_err.h"



+ 42
- 15
src/cms_template.c View File

if (args->argnum > args->allocd) if (args->argnum > args->allocd)
{ {
args->allocd *= 2; args->allocd *= 2;
args->arguments = realloc(args->arguments, sizeof(cms_template_arg) * args->allocd);
args->arguments = realloc(
args->arguments,
sizeof(cms_template_arg) * args->allocd
);
if (!args->arguments) if (!args->arguments)
return cms_err_create(CMS_ERR_ALLOC, 0); return cms_err_create(CMS_ERR_ALLOC, 0);
} }
return cms_err_create(CMS_ERR_NONE, NULL); return cms_err_create(CMS_ERR_NONE, NULL);
} }


static cms_err* str_insert(char* str1, char* str2, size_t start, size_t end, size_t len)
static char* str_insert(
char* str1,
char* str2,
size_t start,
size_t end,
size_t len)
{ {
size_t len2 = strlen(str2); size_t len2 = strlen(str2);


return cms_err_create(CMS_ERR_NONE, NULL);
str1 = realloc(str1, len + len2 - (end - start));
if (str1 == NULL)
return NULL;

memmove(str1 + end, str1 + start, len - start);
memcpy(str1 + start, str2, len2);

return str1;
} }


static cms_err* templatify_arg(char* str, cms_template_arg arg, size_t len)
static char* templatify_arg(char* str, cms_template_arg arg, size_t len)
{ {
#define OFFSET i - match_begin
#define OFFSET i - match_start


size_t match_begin = -1;
size_t match_start = 0;
size_t i = 0; size_t i = 0;
int in_match = 0;


char c; char c;
while ((c = str[i]) != 0) while ((c = str[i]) != 0)
{ {
if (match_begin == -1 && arg.key[0] == c)
if (!in_match && arg.key[0] == c)
{ {
match_begin = i;
match_start = i;
in_match = 1;
} }


if (match_begin != -1 && arg.key[OFFSET] == 0)
if (in_match && arg.key[OFFSET] != 0)
{ {
if (arg.key[OFFSET] != c)
in_match = 0;
}
else if (in_match)
{
str = str_insert(str, arg.val, match_start, i, len);
if (str == NULL)
return NULL;

in_match = 0;
} }


i += 1; i += 1;


#undef OFFSET #undef OFFSET


return cms_err_create(CMS_ERR_NONE, NULL);
return str;
} }


cms_err* cms_templateify(char* str, cms_template_args* args)
char* cms_templateify(char* str, cms_template_args* args)
{ {
size_t len = strlen(str); size_t len = strlen(str);


size_t i; size_t i;
for (i = 0; i < args->argnum; ++i) for (i = 0; i < args->argnum; ++i)
{ {
cms_err* err = templatify_arg(str, args->arguments[i], len);
if (err)
return err;
str = templatify_arg(str, args->arguments[i], len);
if (str == NULL)
return NULL;
} }


return cms_err_create(CMS_ERR_NONE, NULL);
return str;
} }

+ 1
- 1
src/cms_template.h View File



cms_err* cms_template_args_append(cms_template_args* args, char* key, char* val); cms_err* cms_template_args_append(cms_template_args* args, char* key, char* val);


cms_err* cms_templateify(char* name, cms_template_args* args);
char* cms_templateify(char* str, cms_template_args* args);


#endif #endif

Loading…
Cancel
Save