costin 01/12/13 23:09:31
Modified: jk/native2/common jk_map.c
Log:
The implementation change to support the new interface.
Revision Changes Path
1.7 +379 -354 jakarta-tomcat-connectors/jk/native2/common/jk_map.c
Index: jk_map.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_map.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- jk_map.c 2001/12/12 21:56:43 1.6
+++ jk_map.c 2001/12/14 07:09:31 1.7
@@ -58,7 +58,7 @@
/***************************************************************************
* Description: General purpose map object *
* Author: Gal Shachor <[EMAIL PROTECTED]> *
- * Version: $Revision: 1.6 $ *
+ * Version: $Revision: 1.7 $ *
***************************************************************************/
#include "jk_global.h"
@@ -69,132 +69,241 @@
#define CAPACITY_INC_SIZE (50)
#define LENGTH_OF_LINE (1024)
-struct jk_map {
- jk_pool_t *pool;
+typedef struct jk_map_private {
+ char **names;
+ void **values;
+
+ int capacity;
+ int size;
+} jk_map_private_t;
- const char **names;
- const void **values;
-
- unsigned capacity;
- unsigned size;
-};
-
+static int jk_map_default_realloc(jk_map_t *m);
static void trim_prp_comment(char *prp);
static int trim(char *s);
-static int map_realloc(jk_map_t *m);
-int map_alloc(jk_map_t **m, jk_pool_t *pool )
+static void *jk_map_default_get(jk_env_t *env, jk_map_t *m,
+ const char *name)
{
- jk_map_t *_this;
+ int i;
+ jk_map_private_t *mPriv;
+
+ if(name==NULL )
+ return NULL;
+ mPriv=(jk_map_private_t *)m->_private;
- if( m== NULL )
+ for(i = 0 ; i < mPriv->size ; i++) {
+ if(0 == strcmp(mPriv->names[i], name)) {
+ return mPriv->values[i];
+ }
+ }
+ return NULL;
+}
+
+
+static int jk_map_default_put(jk_env_t *env, jk_map_t *m,
+ const char *name, void *value,
+ void **old)
+{
+ int rc = JK_FALSE;
+ int i;
+ jk_map_private_t *mPriv;
+
+ if( name==NULL )
return JK_FALSE;
+
+ mPriv=(jk_map_private_t *)m->_private;
- _this=(jk_map_t *)pool->alloc(pool, sizeof(jk_map_t));
- *m=_this;
+ for(i = 0 ; i < mPriv->size ; i++) {
+ if(0 == strcmp(mPriv->names[i], name)) {
+ break;
+ }
+ }
- if( _this == NULL )
- return JK_FALSE;
+ /* Old value found */
+ if(i < mPriv->size) {
+ if( old!=NULL )
+ *old = (void *) mPriv->values[i]; /* DIRTY */
+ mPriv->values[i] = value;
+ return JK_TRUE;
+ }
- _this->pool = pool;
+ jk_map_default_realloc(m);
- _this->capacity = 0;
- _this->size = 0;
- _this->names = NULL;
- _this->values = NULL;
+ if(mPriv->size < mPriv->capacity) {
+ mPriv->values[mPriv->size] = value;
+ /* XXX this is wrong - either we take ownership and copy both
+ name and value,
+ or none. The caller should do that if he needs !
+ */
+ /* mPriv->names[mPriv->size] = m->pool->pstrdup(m->pool, name); */
+ mPriv->names[mPriv->size] = name;
+ mPriv->size ++;
+ rc = JK_TRUE;
+ }
+ return rc;
+}
- return JK_TRUE;
+static int jk_map_default_size(jk_env_t *env, jk_map_t *m)
+{
+ jk_map_private_t *mPriv;
+
+ /* assert(m!=NULL) -- we call it via m->... */
+ mPriv=(jk_map_private_t *)m->_private;
+ return mPriv->size;
}
-int map_free(jk_map_t **m)
+static char *jk_map_default_nameAt(jk_env_t *env, jk_map_t *m,
+ int idex)
{
- int rc = JK_FALSE;
+ jk_map_private_t *mPriv;
- if(m && *m) {
- (*m)->pool->close((*m)->pool);
- rc = JK_TRUE;
- /* free(*m); */
- *m = NULL;
- }
- return rc;
+ mPriv=(jk_map_private_t *)m->_private;
+
+ if(idex < 0 || idex > mPriv->size )
+ return NULL;
+
+ return (char *)mPriv->names[idex];
}
-void *map_get(jk_map_t *m,
- const char *name,
- const void *def)
-{
- const void *rc = (void *)def;
-
- if(m && name) {
- unsigned i;
- for(i = 0 ; i < m->size ; i++) {
- if(0 == strcmp(m->names[i], name)) {
- rc = m->values[i];
- break;
- }
- }
- }
+static void *jk_map_default_valueAt(jk_env_t *env, jk_map_t *m,
+ int idex)
+{
+ jk_map_private_t *mPriv;
+
+ mPriv=(jk_map_private_t *)m->_private;
- return (void *)rc; /* DIRTY */
+ if(idex < 0 || idex > mPriv->size )
+ return NULL;
+
+ return (void *) mPriv->values[idex];
}
-int map_get_int(jk_map_t *m,
- const char *name,
- int def)
+static void jk_map_default_clear(jk_env_t *env, jk_map_t *m )
{
- char buf[100];
- char *rc;
- int len;
- int int_res;
- int multit = 1;
+
+}
+
+static void jk_map_default_init(jk_env_t *env, jk_map_t *m, int initialSize,
+ void *wrappedObj)
+{
- sprintf(buf, "%d", def);
- rc = map_get_string(m, name, buf);
+}
+
+
+
+/* ==================== */
+/* General purpose map utils - independent of the map impl */
+
+int jk_map_append(jk_env_t *env, jk_map_t * dst, jk_map_t * src )
+{
+ /* This was badly broken in the original ! */
+ int sz = src->size(env, src);
+ int i;
+ for(i = 0 ; i < sz ; i++) {
+ char *name = src->nameAt(env, src, i);
+ void *value = src->valueAt(env, src, i);
- len = strlen(rc);
- if(len) {
- char *lastchar = rc + len - 1;
- if('m' == *lastchar || 'M' == *lastchar) {
- *lastchar = '\0';
- multit = 1024 * 1024;
- } else if('k' == *lastchar || 'K' == *lastchar) {
- *lastchar = '\0';
- multit = 1024;
+ if( dst->get(env, dst, name ) == NULL) {
+ int rc= dst->put(env, dst, name, value, NULL );
+ if( rc != JK_TRUE )
+ return rc;
}
}
+ return JK_TRUE;
+}
- int_res = atoi(rc);
- return int_res * multit;
-}
-double map_get_double(jk_map_t *m,
- const char *name,
- double def)
+char *jk_map_getString(jk_env_t *env, jk_map_t *m,
+ const char *name, char *def)
{
- char buf[100];
- char *rc;
+ char *val= m->get( env, m, name );
+ if( val==NULL )
+ return def;
+ return val;
+}
- sprintf(buf, "%f", def);
- rc = map_get_string(m, name, buf);
- return atof(rc);
+/** Get a string property, using the worker's style
+ for properties.
+ Example worker.ajp13.host=localhost.
+*/
+char *jk_map_getStrProp(jk_env_t *env, jk_map_t *m,
+ const char *objType, const char *objName,
+ const char *pname,
+ char *def)
+{
+ char buf[1024];
+
+ if( m==NULL || objType==NULL || objName==NULL || pname==NULL ) {
+ return def;
+ }
+ sprintf(buf, "%s.%s.%s", objType, objName, pname);
+ return m->get(env, m, buf );
}
-char *map_get_string(jk_map_t *m,
- const char *name,
- const char *def)
+int jk_map_getIntProp(jk_env_t *env, jk_map_t *m,
+ const char *objType, const char *objName,
+ const char *pname,
+ int def)
{
- return map_get(m, name, def);
+ char *val=jk_map_getStrProp( env, m, objType, objName, pname, NULL );
+
+ if( val==NULL )
+ return def;
+
+ return jk_map_str2int( env, val );
+}
+
+
+/* ==================== */
+/* Conversions */
+
+/* Convert a string to int, using 'M', 'K' suffixes
+ */
+int jk_map_str2int(jk_env_t *env, char *val )
+{ /* map2int:
+ char *v=getString();
+ return (c==NULL) ? def : str2int( v );
+ */
+ int len;
+ int int_res;
+ char org='\0';
+ int multit = 1;
+ char *lastchar;
+
+ if( val==NULL ) return 0;
+
+ /* sprintf(buf, "%d", def); */
+ /* rc = map_get_string(m, name, buf); */
+
+ len = strlen(val);
+ if(len==0)
+ return 0;
+
+ lastchar = val + len - 1;
+ if('m' == *lastchar || 'M' == *lastchar) {
+ org=*lastchar;
+ *lastchar = '\0';
+ multit = 1024 * 1024;
+ } else if('k' == *lastchar || 'K' == *lastchar) {
+ org=*lastchar;
+ *lastchar = '\0';
+ multit = 1024;
+ }
+
+ int_res = atoi(val);
+ if( org!='\0' )
+ *lastchar=org;
+
+ return int_res * multit;
}
-char **map_get_string_list(jk_map_t *m,
- jk_pool_t *pool,
- const char *name,
- unsigned *list_len,
- const char *def)
+char **jk_map_split(jk_env_t *env, jk_map_t *m,
+ jk_pool_t *pool,
+ const char *listStr,
+ unsigned *list_len )
{
- char *listStr = map_get_string(m, name, def);
char **ar = NULL;
unsigned capacity = 0;
unsigned idex = 0;
@@ -239,119 +348,137 @@
return ar;
}
+
-int map_put(jk_map_t *m,
- const char *name,
- const void *value,
- void **old)
+/* ==================== */
+/* Reading / parsing */
+
+int jk_map_readFileProperties(jk_env_t *env, jk_map_t *m,
+ const char *f)
{
int rc = JK_FALSE;
- unsigned int i;
+ FILE *fp;
+ char buf[LENGTH_OF_LINE + 1];
+ char *prp;
+ char *v;
+
+ if(m==NULL || f==NULL )
+ return JK_FALSE;
- if(m==NULL || name==NULL )
+ fp= fopen(f, "r");
+
+ if(fp==NULL)
return JK_FALSE;
+
+ rc = JK_TRUE;
+
+ while(NULL != (prp = fgets(buf, LENGTH_OF_LINE, fp))) {
+ char *oldv;
+
+ trim_prp_comment(prp);
+
+ if( trim(prp)==0 )
+ continue;
+
+ v = strchr(prp, '=');
+ if(v==NULL)
+ continue;
+
+ *v = '\0';
+ v++;
+
+ if(strlen(v)==0 || strlen(prp)==0)
+ continue;
+
+ oldv = m->get(env, m, prp );
+
+ v = jk_map_replaceProperties(env, m, m->pool, v);
+
+ if(oldv) {
+ char *tmpv = m->pool->alloc(m->pool,
+ strlen(v) + strlen(oldv) + 3);
+ char sep = '*';
+
+ if(tmpv==NULL) {
+ rc=JK_FALSE;
+ break;
+ }
- for(i = 0 ; i < m->size ; i++) {
- if(0 == strcmp(m->names[i], name)) {
+ if(jk_is_some_property(prp, "path")) {
+ sep = PATH_SEPERATOR;
+ } else if(jk_is_some_property(prp, "cmd_line")) {
+ sep = ' ';
+ }
+
+ sprintf(tmpv, "%s%c%s", oldv, sep, v);
+ v = tmpv;
+ } else {
+ v = m->pool->pstrdup(m->pool, v);
+ }
+
+ if(v==NULL) {
+ /* Allocation error */
+ rc = JK_FALSE;
break;
}
- }
- /* Old value found */
- if(i < m->size) {
- if( old!=NULL )
- *old = (void *) m->values[i]; /* DIRTY */
- m->values[i] = value;
- return JK_TRUE;
+ m->put(env, m, prp, v, NULL);
}
-
- map_realloc(m);
-
- if(m->size < m->capacity) {
- m->values[m->size] = value;
- m->names[m->size] = m->pool->pstrdup(m->pool, name);
- m->size ++;
- rc = JK_TRUE;
- }
+
+ fclose(fp);
return rc;
}
-/* XXX Very strange hack to deal with special properties
+/**
+ * Replace $(property) in value.
+ *
*/
-int jk_is_some_property(const char *prp_name, const char *suffix)
+char *jk_map_replaceProperties(jk_env_t *env, jk_map_t *m,
+ struct jk_pool *resultPool,
+ const char *value)
{
- if (prp_name && suffix) {
- size_t prp_name_len = strlen(prp_name);
- size_t suffix_len = strlen(suffix);
- if (prp_name_len >= suffix_len) {
- const char *prp_suffix = prp_name + prp_name_len - suffix_len;
- if(0 == strcmp(suffix, prp_suffix)) {
- return JK_TRUE;
- }
- }
- }
+ char *rc = (char *)value;
+ char *env_start = rc;
+ int rec = 0;
- return JK_FALSE;
-}
+ while(env_start = strstr(env_start, "$(")) {
+ char *env_end = strstr(env_start, ")");
+ if( rec++ > 20 ) return rc;
+ if(env_end) {
+ char env_name[LENGTH_OF_LINE + 1] = "";
+ char *env_value;
-int map_read_properties(jk_map_t *m,
- const char *f)
-{
- int rc = JK_FALSE;
+ *env_end = '\0';
+ strcpy(env_name, env_start + 2);
+ *env_end = ')';
- if(m && f) {
- FILE *fp = fopen(f, "r");
-
- if(fp) {
- char buf[LENGTH_OF_LINE + 1];
- char *prp;
+ env_value = m->get(env, m, env_name);
- rc = JK_TRUE;
+ if(env_value != NULL ) {
+ env_value=getenv( env_name );
+ }
- while(NULL != (prp = fgets(buf, LENGTH_OF_LINE, fp))) {
- trim_prp_comment(prp);
- if(trim(prp)) {
- char *v = strchr(prp, '=');
- if(v) {
- *v = '\0';
- v++;
- if(strlen(v) && strlen(prp)) {
- char *oldv = map_get_string(m, prp, NULL);
- v = map_replace_properties(v, m);
-
- if(oldv) {
- char *tmpv = m->pool->alloc(m->pool,
- strlen(v) +
strlen(oldv) + 3);
- if(tmpv) {
- char sep = '*';
- if(jk_is_some_property(prp, "path")) {
- sep = PATH_SEPERATOR;
- } else if(jk_is_some_property(prp, "cmd_line"))
{
- sep = ' ';
- }
-
- sprintf(tmpv, "%s%c%s",
- oldv, sep, v);
- }
- v = tmpv;
- } else {
- v = m->pool->pstrdup(m->pool, v);
- }
-
- if(v) {
- void *old = NULL;
- map_put(m, prp, v, &old);
- } else {
- rc = JK_FALSE;
- break;
- }
- }
- }
+ if(env_value != NULL ) {
+ int offset=0;
+ char *new_value = resultPool->alloc(resultPool,
+ (strlen(rc) +
strlen(env_value)));
+ if(!new_value) {
+ break;
}
+ *env_start = '\0';
+ strcpy(new_value, rc);
+ strcat(new_value, env_value);
+ strcat(new_value, env_end + 1);
+ offset= env_start - rc + strlen( env_value );
+ rc = new_value;
+ /* Avoid recursive subst */
+ env_start = rc + offset;
+ } else {
+ env_start = env_end;
}
-
- fclose(fp);
+ } else {
+ break;
}
}
@@ -359,35 +486,77 @@
}
-int map_size(jk_map_t *m)
-{
- if(m) {
- return m->size;
- }
+/* ==================== */
+/* Internal utils */
- return -1;
-}
-char *map_name_at(jk_map_t *m,
- int idex)
+int jk_map_default_create(jk_env_t *env, jk_map_t **m, jk_pool_t *pool )
{
- if(m && idex >= 0) {
- return (char *)m->names[idex]; /* DIRTY */
- }
+ jk_map_t *_this;
+ jk_map_private_t *mPriv;
- return NULL;
+ if( m== NULL )
+ return JK_FALSE;
+
+ _this=(jk_map_t *)pool->alloc(pool, sizeof(jk_map_t));
+ mPriv=(jk_map_private_t *)pool->alloc(pool, sizeof(jk_map_private_t));
+ *m=_this;
+
+ if( _this == NULL || mPriv==NULL )
+ return JK_FALSE;
+
+ _this->pool = pool;
+ _this->_private=mPriv;
+
+ mPriv->capacity = 0;
+ mPriv->size = 0;
+ mPriv->names = NULL;
+ mPriv->values = NULL;
+
+ _this->get=jk_map_default_get;
+ _this->put=jk_map_default_put;
+ _this->size=jk_map_default_size;
+ _this->nameAt=jk_map_default_nameAt;
+ _this->valueAt=jk_map_default_valueAt;
+ _this->init=jk_map_default_init;
+ _this->clear=jk_map_default_clear;
+
+
+ return JK_TRUE;
}
+
+/* int map_free(jk_map_t **m) */
+/* { */
+/* int rc = JK_FALSE; */
+
+/* if(m && *m) { */
+/* (*m)->pool->close((*m)->pool); */
+/* rc = JK_TRUE; */
+/* *m = NULL; */
+/* } */
+/* return rc; */
+/* } */
+
-void *map_value_at(jk_map_t *m,
- int idex)
+/* XXX Very strange hack to deal with special properties
+ */
+int jk_is_some_property(const char *prp_name, const char *suffix)
{
- if(m && idex >= 0) {
- return (void *) m->values[idex]; /* DIRTY */
+ if (prp_name && suffix) {
+ size_t prp_name_len = strlen(prp_name);
+ size_t suffix_len = strlen(suffix);
+ if (prp_name_len >= suffix_len) {
+ const char *prp_suffix = prp_name + prp_name_len - suffix_len;
+ if(0 == strcmp(suffix, prp_suffix)) {
+ return JK_TRUE;
+ }
+ }
}
- return NULL;
+ return JK_FALSE;
}
+
static void trim_prp_comment(char *prp)
{
char *comment = strchr(prp, '#');
@@ -396,6 +565,7 @@
}
}
+
static int trim(char *s)
{
int i;
@@ -415,26 +585,28 @@
return strlen(s);
}
-static int map_realloc(jk_map_t *m)
+static int jk_map_default_realloc(jk_map_t *m)
{
- if(m->size == m->capacity) {
+ jk_map_private_t *mPriv=m->_private;
+
+ if(mPriv->size == mPriv->capacity) {
char **names;
void **values;
- int capacity = m->capacity + CAPACITY_INC_SIZE;
+ int capacity = mPriv->capacity + CAPACITY_INC_SIZE;
names = (char **)m->pool->alloc(m->pool, sizeof(char *) * capacity);
values = (void **)m->pool->alloc(m->pool, sizeof(void *) * capacity);
if(values && names) {
- if (m->capacity && m->names)
- memcpy(names, m->names, sizeof(char *) * m->capacity);
+ if (mPriv->capacity && mPriv->names)
+ memcpy(names, mPriv->names, sizeof(char *) * mPriv->capacity);
- if (m->capacity && m->values)
- memcpy(values, m->values, sizeof(void *) * m->capacity);
+ if (mPriv->capacity && mPriv->values)
+ memcpy(values, mPriv->values, sizeof(void *) * mPriv->capacity);
- m->names = (const char **)names;
- m->values = (const void **)values;
- m->capacity = capacity;
+ mPriv->names = ( char **)names;
+ mPriv->values = ( void **)values;
+ mPriv->capacity = capacity;
return JK_TRUE;
}
@@ -443,156 +615,9 @@
return JK_FALSE;
}
-/**
- * Replace $(property) in value.
- *
- */
-char *map_replace_properties(const char *value, jk_map_t *m)
-{
- char *rc = (char *)value;
- char *env_start = rc;
- int rec = 0;
- while(env_start = strstr(env_start, "$(")) {
- char *env_end = strstr(env_start, ")");
- if( rec++ > 20 ) return rc;
- if(env_end) {
- char env_name[LENGTH_OF_LINE + 1] = "";
- char *env_value;
-
- *env_end = '\0';
- strcpy(env_name, env_start + 2);
- *env_end = ')';
-
- env_value = map_get_string(m, env_name, NULL);
- if(!env_value) {
- env_value=getenv( env_name );
- }
- if(env_value) {
- int offset=0;
- char *new_value = m->pool->alloc(m->pool,
- (sizeof(char) * (strlen(rc) +
strlen(env_value))));
- if(!new_value) {
- break;
- }
- *env_start = '\0';
- strcpy(new_value, rc);
- strcat(new_value, env_value);
- strcat(new_value, env_end + 1);
- offset= env_start - rc + strlen( env_value );
- rc = new_value;
- /* Avoid recursive subst */
- env_start = rc + offset;
- } else {
- env_start = env_end;
- }
- } else {
- break;
- }
- }
-
- return rc;
-}
-
-
-/** Get a string property, using the worker's style
- for properties.
- Example worker.ajp13.host=localhost.
-*/
-char *map_getStrProp(jk_map_t *m,
- const char *objType,
- const char *objName,
- const char *pname,
- char *def)
-{
- char buf[1024];
- if( m==NULL ||
- objType==NULL ||
- objName==NULL ||
- pname==NULL ) {
- return def;
- }
-
- sprintf(buf, "%s.%s.%s", objType, objName, pname);
- return map_get_string(m, buf, NULL);
-}
-
-int map_getIntProp(jk_map_t *m,
- const char *objType,
- const char *objName,
- const char *pname,
- const int def)
-{
- char buf[1024];
-
- if( m==NULL ||
- objType==NULL ||
- objName==NULL ||
- pname==NULL ) {
- return def;
- }
-
- sprintf(buf, "%s.%s.%s", objType, objName, pname);
- return map_get_int(m, buf, def);
-}
-
-double map_getDoubleProp(jk_map_t *m,
- const char *objType,
- const char *objName,
- const char *pname,
- const double def)
-{
- char buf[1024];
-
- if( m==NULL ||
- objType==NULL ||
- objName==NULL ||
- pname==NULL ) {
- return def;
- }
-
- sprintf(buf, "%s.%s.%s", objType, objName, pname);
- return map_get_double(m, buf, def);
-}
-
-char **map_getListProp(jk_map_t *m,
- const char *objType,
- const char *objName,
- const char *pname,
- unsigned *size)
-{
- char buf[1024];
- if( m==NULL ||
- objType==NULL ||
- objName==NULL ||
- pname==NULL ) {
- return NULL;
- }
- sprintf(buf, "%s.%s.%s", objType, objName, pname);
- return map_get_string_list(m, m->pool, buf, size, NULL);
-}
-
-/** Utility - copy a map . XXX Should move to jk_map, it's generic code.
- */
-int map_copy(jk_pool_t *pool, jk_map_t * src, jk_map_t * dst )
-{
- int sz = map_size(src);
- int i;
- for(i = 0 ; i < sz ; i++) {
- void *old;
- char *name = map_name_at(src, i);
- if(map_get(src, name, NULL) == NULL) {
- if(!map_put(dst, name,
- pool->pstrdup(pool, map_get_string(src, name, NULL)),
- &old)) {
- return JK_FALSE;
- }
- }
- }
- return JK_TRUE;
-}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>