completed initial implementation of qse_env_t
This commit is contained in:
parent
c73a51dbbc
commit
6f7f368a91
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: pio.h 455 2011-05-09 16:11:13Z hyunghwan.chung $
|
* $Id$
|
||||||
*
|
*
|
||||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -24,11 +24,19 @@
|
|||||||
#include <qse/types.h>
|
#include <qse/types.h>
|
||||||
#include <qse/macros.h>
|
#include <qse/macros.h>
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file defines data types and functions that you can use to build
|
||||||
|
* an environment block.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The qse_env_t type defines a cross-platform environment block.
|
||||||
|
*/
|
||||||
typedef struct qse_env_t qse_env_t;
|
typedef struct qse_env_t qse_env_t;
|
||||||
|
|
||||||
struct qse_env_t
|
struct qse_env_t
|
||||||
{
|
{
|
||||||
QSE_DEFINE_COMMON_FIELDS(pio)
|
QSE_DEFINE_COMMON_FIELDS(env)
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: pio.h 455 2011-05-09 16:11:13Z hyunghwan.chung $
|
* $Id$
|
||||||
*
|
*
|
||||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -86,7 +86,7 @@ void qse_env_clear (qse_env_t* env)
|
|||||||
}
|
}
|
||||||
if (env->arr.ptr)
|
if (env->arr.ptr)
|
||||||
{
|
{
|
||||||
env->arr.ptr = QSE_NULL;
|
env->arr.ptr[0] = QSE_NULL;
|
||||||
env->arr.len = 0;
|
env->arr.len = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -103,23 +103,37 @@ static int expandarr (qse_env_t* env)
|
|||||||
|
|
||||||
env->arr.ptr = tmp;
|
env->arr.ptr = tmp;
|
||||||
env->arr.capa = ncapa;
|
env->arr.capa = ncapa;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int expandstr (qse_env_t* env, qse_size_t inc)
|
static int expandstr (qse_env_t* env, qse_size_t inc)
|
||||||
{
|
{
|
||||||
qse_char_t* tmp;
|
qse_char_t* tmp;
|
||||||
qse_size_t ncapa = env->str.capa;
|
qse_size_t ncapa;
|
||||||
|
|
||||||
ncapa = (inc > STRSIZE)? (ncapa + inc): (ncapa + STRSIZE);
|
ncapa = (inc > STRSIZE)?
|
||||||
|
(env->str.capa + inc): (env->str.capa + STRSIZE);
|
||||||
|
|
||||||
tmp = (qse_char_t*) QSE_MMGR_REALLOC (
|
tmp = (qse_char_t*) QSE_MMGR_REALLOC (
|
||||||
env->mmgr, env->str.ptr,
|
env->mmgr, env->str.ptr,
|
||||||
QSE_SIZEOF(qse_char_t) * (ncapa + 1));
|
QSE_SIZEOF(qse_char_t) * (ncapa + 1));
|
||||||
if (tmp == QSE_NULL) return -1;
|
if (tmp == QSE_NULL) return -1;
|
||||||
|
|
||||||
|
if (tmp != env->str.ptr)
|
||||||
|
{
|
||||||
|
/* reallocation relocated the string buffer.
|
||||||
|
* the pointers in the pointer array have to be adjusted */
|
||||||
|
qse_size_t i;
|
||||||
|
for (i = 0; i < env->arr.len; i++)
|
||||||
|
{
|
||||||
|
env->arr.ptr[i] = tmp + (env->arr.ptr[i] - env->str.ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
env->str.ptr = tmp;
|
env->str.ptr = tmp;
|
||||||
env->str.capa = ncapa;
|
env->str.capa = ncapa;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,28 +165,46 @@ int qse_env_insert (
|
|||||||
|
|
||||||
int qse_env_delete (qse_env_t* env, const qse_char_t* name)
|
int qse_env_delete (qse_env_t* env, const qse_char_t* name)
|
||||||
{
|
{
|
||||||
const qse_char_t* p = env->str.ptr;
|
|
||||||
qse_size_t i;
|
qse_size_t i;
|
||||||
|
|
||||||
for (i = 0; i < env->arr.len; i++)
|
for (i = 0; i < env->arr.len; i++)
|
||||||
{
|
{
|
||||||
const qse_char_t* eq;
|
const qse_char_t* eq;
|
||||||
const qse_char_t* vp;
|
qse_char_t* vp;
|
||||||
|
|
||||||
vp = env->arr.ptr[i];
|
vp = env->arr.ptr[i];
|
||||||
|
|
||||||
|
//qse_printf (QSE_T("comparing [%s] []\n"), vp);
|
||||||
eq = qse_strbeg (vp, name);
|
eq = qse_strbeg (vp, name);
|
||||||
if (eq && *eq == QSE_T('='))
|
if (eq && *eq == QSE_T('='))
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
/* bingo */
|
/* bingo */
|
||||||
|
qse_size_t len, rem;
|
||||||
|
|
||||||
|
/*
|
||||||
|
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
||||||
|
A B C = D E F \0 X = Y Y \0 Z = T T \0 \0
|
||||||
|
|
||||||
|
env->str.len = 18
|
||||||
|
env->str.ptr = 5
|
||||||
|
vp = 13
|
||||||
|
len = 4 + 1
|
||||||
|
*/
|
||||||
len = qse_strlen (vp) + 1;
|
len = qse_strlen (vp) + 1;
|
||||||
QSE_MEMCPY (vp, vp + len, ... );
|
rem = env->str.len - (vp + len - env->str.ptr) + 1;
|
||||||
#endif
|
QSE_MEMCPY (vp, vp + len, rem * QSE_SIZEOF(qse_char_t));
|
||||||
|
env->str.len -= len;
|
||||||
|
|
||||||
|
env->arr.len--;
|
||||||
|
for (; i < env->arr.len; i++)
|
||||||
|
env->arr.ptr[i] = env->arr.ptr[i+1] - len;
|
||||||
|
env->arr.ptr[i] = QSE_NULL;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int add_envstr (qse_env_t* env, const qse_char_t* nv)
|
static int add_envstr (qse_env_t* env, const qse_char_t* nv)
|
||||||
|
@ -12,18 +12,91 @@ static int test1 (void)
|
|||||||
{
|
{
|
||||||
qse_env_t* env;
|
qse_env_t* env;
|
||||||
const qse_char_t* envstr;
|
const qse_char_t* envstr;
|
||||||
|
qse_char_t** envarr;
|
||||||
|
|
||||||
env = qse_env_open (QSE_NULL, 0);
|
env = qse_env_open (QSE_NULL, 0, 0);
|
||||||
|
|
||||||
qse_env_addvar (env, QSE_T("alice"), QSE_T("wonderland"));
|
qse_env_clear (env);
|
||||||
qse_env_addvar (env, QSE_T("cool"), QSE_T("mint"));
|
qse_env_insert (env, QSE_T("alice"), QSE_T("wonderland"));
|
||||||
|
qse_env_insert (env, QSE_T("cool"), QSE_T("mint"));
|
||||||
|
qse_env_insert (env, QSE_T("smurf"), QSE_T("happy song"));
|
||||||
|
qse_env_insert (env, QSE_T("donkey"), QSE_T("mule"));
|
||||||
|
qse_env_insert (env, QSE_T("lily"), QSE_T("rose"));
|
||||||
|
|
||||||
|
qse_env_clear (env);
|
||||||
|
qse_env_insert (env, QSE_T("alice"), QSE_T("wonderland"));
|
||||||
|
qse_env_insert (env, QSE_T("cool"), QSE_T("mint"));
|
||||||
|
qse_env_insert (env, QSE_T("smurf"), QSE_T("happy song"));
|
||||||
|
qse_env_insert (env, QSE_T("donkey"), QSE_T("mule"));
|
||||||
|
qse_env_insert (env, QSE_T("lily"), QSE_T("rose"));
|
||||||
|
|
||||||
|
|
||||||
|
qse_env_delete (env, QSE_T("cool"));
|
||||||
|
qse_env_insert (env, QSE_T("spider"), QSE_T("man"));
|
||||||
|
|
||||||
envstr = qse_env_getstr (env);
|
envstr = qse_env_getstr (env);
|
||||||
|
if (envstr)
|
||||||
|
{
|
||||||
while (*envstr != QSE_T('\0'))
|
while (*envstr != QSE_T('\0'))
|
||||||
{
|
{
|
||||||
qse_printf (QSE_T("%s\n"), envstr);
|
qse_printf (QSE_T("%p [%s]\n"), envstr, envstr);
|
||||||
envstr += qse_strlen(envstr) + 1;
|
envstr += qse_strlen(envstr) + 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qse_printf (QSE_T("=====\n"));
|
||||||
|
envarr = qse_env_getarr (env);
|
||||||
|
if (envarr)
|
||||||
|
{
|
||||||
|
while (*envarr)
|
||||||
|
{
|
||||||
|
qse_printf (QSE_T("%p [%s]\n"), *envarr, *envarr);
|
||||||
|
envarr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qse_env_close (env);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test2 (void)
|
||||||
|
{
|
||||||
|
qse_env_t* env;
|
||||||
|
const qse_char_t* envstr;
|
||||||
|
qse_char_t** envarr;
|
||||||
|
|
||||||
|
env = qse_env_open (QSE_NULL, 0, 1);
|
||||||
|
|
||||||
|
qse_printf (QSE_T("DELETING HOME => %s\n"),
|
||||||
|
(qse_env_delete (env, QSE_T("HOME")) == 0?
|
||||||
|
QSE_T("SUCCESS"): QSE_T("FAILURE"))
|
||||||
|
);
|
||||||
|
qse_printf (QSE_T("DELETING wolf => %s\n"),
|
||||||
|
(qse_env_delete (env, QSE_T("wolf")) == 0?
|
||||||
|
QSE_T("SUCCESS"): QSE_T("FAILURE"))
|
||||||
|
);
|
||||||
|
|
||||||
|
envstr = qse_env_getstr (env);
|
||||||
|
if (envstr)
|
||||||
|
{
|
||||||
|
while (*envstr != QSE_T('\0'))
|
||||||
|
{
|
||||||
|
qse_printf (QSE_T("%p [%s]\n"), envstr, envstr);
|
||||||
|
envstr += qse_strlen(envstr) + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
qse_printf (QSE_T("=====\n"));
|
||||||
|
envarr = qse_env_getarr (env);
|
||||||
|
if (envarr)
|
||||||
|
{
|
||||||
|
while (*envarr)
|
||||||
|
{
|
||||||
|
qse_printf (QSE_T("%p [%s]\n"), *envarr, *envarr);
|
||||||
|
envarr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
qse_env_close (env);
|
qse_env_close (env);
|
||||||
return 0;
|
return 0;
|
||||||
@ -32,5 +105,6 @@ static int test1 (void)
|
|||||||
int main ()
|
int main ()
|
||||||
{
|
{
|
||||||
R (test1);
|
R (test1);
|
||||||
|
R (test2);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user