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

@@ -1,10 +1,10 @@
appname = housecat

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:
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:
mv $(appname) /usr/bin/$(appname)

+ 1
- 0
src/cms_build.c View File

@@ -8,6 +8,7 @@
#include <string.h>

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

+ 0
- 3
src/cms_err.c View File

@@ -2,9 +2,6 @@
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#ifdef DEBUG
#include <error.h>
#endif

#include "cms_err.h"


+ 42
- 15
src/cms_template.c View File

@@ -23,7 +23,10 @@ cms_err* cms_template_args_append(cms_template_args* args, char* key, char* val)
if (args->argnum > args->allocd)
{
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)
return cms_err_create(CMS_ERR_ALLOC, 0);
}
@@ -34,30 +37,54 @@ cms_err* cms_template_args_append(cms_template_args* args, char* key, char* val)
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);

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;
int in_match = 0;

char c;
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;
@@ -65,20 +92,20 @@ static cms_err* templatify_arg(char* str, cms_template_arg arg, size_t len)

#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 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

@@ -20,6 +20,6 @@ cms_template_args* cms_template_args_create();

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

Loading…
Cancel
Save