示例#1
0
文件: property.c 项目: RiJo/batbeep
void load_properties(hashmap *map, FILE *file) {
    int temp = 0;
    int key_done = 0, done = 0;
    char key[BUFFER_SIZE];
    char value[BUFFER_SIZE];
    
    memset(key, '\0', BUFFER_SIZE);
    memset(value, '\0', BUFFER_SIZE);
    
    register unsigned int i = 0;
    while (!done) {
        temp = fgetc(file);
        switch (temp) {
            case EOF:
                done = 1;
                // break;
            case NL:
                value[i] = '\0';
                if (strlen(key) > 0) {
                    char *data = malloc(strlen(value) + 1);
                    strcpy(data, value);
                    hm_set(map, key, data);
                }
                memset(key, '\0', BUFFER_SIZE);
                memset(value, '\0', BUFFER_SIZE);
                key_done = 0;
                i = 0;
                break;
            case SEPARATOR:
                key[i] = '\0';
                i = 0;
                key_done = 1;
                break;
            case ' ':
            case '\t':
                if (i == 0) break;
                // break;
            default:
                if (key_done)
                    value[i++] = temp;
                else
                    key[i++] = temp;
                break;
        }
    }
}
示例#2
0
文件: ctcpio.c 项目: cbh34680/jbx
static int cbif_service_db_set_(void* cbif_handle, const char* key, void* val, void** old_val)
{
	if (cbif_handle && key)
	{
		struct connection_st* conn = cbif_handle;

		if (! conn->db)
		{
			conn->db = hm_init(0);

			if (! conn->db)
			{
				return -1;
			}
		}

		return hm_set(conn->db, key, val, old_val);
	}

	return -1;
}
示例#3
0
int rehash ( hashmap_t *oldhm )
{
    int curfactor = 1;
    int i;
    hashmap_t *newhm;
    entry_t *tmp;

    curfactor = oldhm->capacity / INITIAL_SIZE;
    newhm = hm_init ( ++curfactor );

    for ( i = 0; i < oldhm->capacity; i++ )
    {
        if ( oldhm->buckets[i] != NULL )
        {
            tmp = oldhm->buckets[i]->entries;
            do
            {
                hm_set ( newhm, tmp->key, tmp->value );
            }
            while ( ( tmp = tmp->next ) != NULL );
        }
    }
    return EXIT_SUCCESS;
}
示例#4
0
文件: dllmain.c 项目: cbh34680/jbx
static int on_each_read_record(const struct jbxm_initconf_st* iconf,
                               struct jbxm_callback_if_st* cbif)
{
    assert(iconf);
    assert(cbif);
    assert(cbif->type == JBXM_CBT_EACH_RRECORD);
    assert(cbif->io_area->avail > 0);

    struct UserData_st* ud = dbGET(cbif, "user-data");
    assert(ud);

    // available cbif->io_area->buff[0 to cbif->io_area->avail] + '\0'

    if (ud->bodylen)
    {
// ヘッダの取得は終了し、Content-Length の指定があるので溜め込む

        struct varmem_st* vm = new_varmem((size_t)cbif->io_area->avail);
        assert(vm);

        memcpy(vm->bytes, cbif->io_area->buff, (size_t)cbif->io_area->avail);

        void* ok = ll_add_tail(ud->body_chunks, vm);
        assert(ok);

        ud->body_chunks_sumlen += (size_t)cbif->io_area->avail;

        return 0;
    }

// HTTP ヘッダの収集

    char* buff = (char*)cbif->io_area->buff;
    ljbx_chomp(buff);

    // [if buff is string]
    PRINT("read [%.*s]", (int)cbif->io_area->avail, buff);

    if (! *buff)
    {
// 空行
        if (! ud->method)
        {
// リクエストが設定されていない間は無視

            return 0;
        }

//PRINT("headers\n--->>");
//hm_foreach(ud->headers, print_header_, NULL);
//PRINT("\n---<<");

        const char* clen = hm_get(ud->headers, "content-length");
        if (clen)
        {
// add check digit !!

            const int bodylen = atoi(clen);
            if (bodylen > 0)
            {
// BODY を収集する

                ud->bodylen = (size_t)bodylen;
            }
            else
            {
                if (bodylen)
                {
// bodylen < 0
                    ud->response = http_CreateError(400);
                }
                else
                {
// bodylen == 0
                    ud->response = http_CreateResponse(ud);
                }
            }
        }
        else
        {
            ud->response = http_CreateResponse(ud);
        }

        if (ud->response)
        {
            cbif->flow->next_events = EPOLLOUT | EPOLLET;
        }

        return 0;
    }

    if (ud->method)
    {
// リクエストは解決しているので残りは ud->headers に追加

        char* key = NULL;
        char* val = NULL;

        int ns = sscanf(buff, "%m[^:]: %m[^\r\n]", &key, &val);
        if (ns == 2)
        {
            ljbx_strtolower(key);

            void* old_val = NULL;
            hm_set(ud->headers, key, val, &old_val);
            free(old_val);									// 重複は後勝ち
        }
        else
        {
            free(val);
        }

        free(key);
    }
    else
    {
// リクエストを解決

        char* method = NULL;
        char* path = NULL;
        int major = 0;
        int minor = 0;

        int ns = sscanf(buff, "%m[A-Z] %ms HTTP/%d.%d", &method, &path, &major, &minor);
        if (ns < 2)
        {
            free(method);
            free(path);

            ud->response = http_CreateError(400);
            cbif->flow->next_events = EPOLLOUT | EPOLLET;

            return 0;
        }

        ud->method = method;
        ud->path = path;
        ud->version.major = major;
        ud->version.minor = minor;
    }

    // set cbif->flow->next_events if necessary

    return 0;
}