Beispiel #1
0
static struct ini_arg *create_arg(struct ini_section *head, const char *name, const char *value)
{
    struct ini_arg *p = calloc(1, sizeof(struct ini_arg));

    if (p == NULL)
    {
        ini_free(head);

        return NULL;
    }

    if ((p->name = strdup(name)) == NULL)
    {
        ini_free(head);

        return NULL;
    }

    if ((p->value = strdup(value)) == NULL)
    {
        ini_free(head);

        return NULL;
    }

    return p;
}
Beispiel #2
0
static Game_Entry *
_parse_desktop_game(const char *file)
{
    Game_Entry *game = NULL;
    const char *categories;
    ini_t *ini = ini_new (file);

    ini_parse(ini);
  
    categories = ini_get_string(ini, "Desktop Entry", "Categories");
    if (categories && strstr(categories, "Game"))
    {
        char *tmpicon;
        const char *name = ini_get_string(ini, "Desktop Entry", "Name");
        const char *icon = ini_get_string(ini, "Desktop Entry", "Icon");
        const char *exec = ini_get_string(ini, "Desktop Entry", "Exec");
        
        game = ENNA_NEW(Game_Entry, 1);
        game->name = strdup(name);
        game->exec = strdup(exec);

        if (!ecore_file_is_dir(icon) && ecore_file_can_read(icon))
            game->icon = strdup(icon);
        else if ((tmpicon = _find_icon(icon, "/usr/share/icons")))
            game->icon = tmpicon;
        else if ((tmpicon = _find_icon(icon, "/usr/share/pixmaps")))
            game->icon = tmpicon;
    }
  
    ini_free(ini);
  
    return game;
}
Beispiel #3
0
void clean_up(int sign_no)
{
    redis_free();
    evhttp_free(g_httpd);
    ini_free(setting->ini);
    exit(0);
}
Beispiel #4
0
BOOL APIENTRY DllMain ( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
	switch ( ul_reason_for_call )
	{
	case DLL_PROCESS_ATTACH:
		DisableThreadLibraryCalls( hModule );
		g_hDllModule = hModule;
		SetUnhandledExceptionFilter( unhandledExceptionFilter );
		break;

	case DLL_PROCESS_DETACH:
		if ( g_hOrigDll != NULL )
		{
			FreeLibrary( g_hOrigDll );
			g_hOrigDll = NULL;
			menu_free_all();
			ini_free();
			Log( "Exited\n" );
			if ( set.chatbox_logging && g_SAMP )
				LogChatbox( true, "Logging ended" );
		}

		if ( g_flLog != NULL )
		{
			fclose( g_flLog );
			g_flLog = NULL;
		}

		if ( g_flLogAll != NULL )
		{
			fclose( g_flLogAll );
			g_flLogAll = NULL;
		}

		if ( set.chatbox_logging )
		{
			if ( g_flLogChatbox != NULL )
			{
				fclose( g_flLogChatbox );
				g_flLogChatbox = NULL;
			}

			if ( g_flLogChatboxAll != NULL )
			{
				fclose( g_flLogChatboxAll );
				g_flLogChatboxAll = NULL;
			}
		}
			
		break;
	}

	return true;
}
Beispiel #5
0
static void goldlim_ini_load(void)
{
	char *value;

	ini_t *ini = ini_load(INI_NAME);
	if (!ini) {
		LOG("No "INI_NAME" found.");
		return;
	}

	value = ini_get_setting(ini, "goldlim", "InventoryMultiplier");
	if (value) gold_inv_mul = strtol(value, NULL, 0);

	value = ini_get_setting(ini, "goldlim", "StashMultiplier");
	if (value) gold_stash_mul = strtol(value, NULL, 0);

	ini_free(ini);
}
Beispiel #6
0
Datei: ini.c Projekt: rxi/ini
ini_t* ini_load(const char *filename) {
  ini_t *ini = NULL;
  FILE *fp = NULL;
  int n, sz;

  /* Init ini struct */
  ini = malloc(sizeof(*ini));
  if (!ini) {
    goto fail;
  }
  memset(ini, 0, sizeof(*ini));

  /* Open file */
  fp = fopen(filename, "rb");
  if (!fp) {
    goto fail;
  }

  /* Get file size */
  fseek(fp, 0, SEEK_END);
  sz = ftell(fp);
  rewind(fp);

  /* Load file content into memory, null terminate, init end var */
  ini->data = malloc(sz + 1);
  ini->data[sz] = '\0';
  ini->end = ini->data  + sz;
  n = fread(ini->data, 1, sz, fp);
  if (n != sz) {
    goto fail;
  }

  /* Prepare data */
  split_data(ini);

  /* Clean up and return */
  fclose(fp);
  return ini;

fail:
  if (fp) fclose(fp);
  if (ini) ini_free(ini);
  return NULL;
}
Beispiel #7
0
int main(int argc, char *argv[])
{
  ini_data_st *data;
  char *sec = "section6";
  char *prop = "p1";
  ini_pair pair;
  
  if (argc != 2) {
    fprintf(stderr, "usage: ini_test <INI filename>\n");
    exit(1);
  }

  
  data = ini_init(argv[1]);
  
  if (data) {
    ini_print(data);

    printf("\n\nSearching for section %s, property %s: %s\n", sec, prop, 
	                                                        ini_get_data(data, sec, prop));
    printf("\nSearching for global property %s: %s\n\n", prop, 
	                                                   ini_get_data(data, NULL, prop));

    printf("testing iterator, printing list of all properties in \"section2\":\n");
    
    pair = ini_iter_init(data, "section2");
    printf("%s = %s\n", pair.n, pair.v);
    
    pair = ini_iter_next(data);
    while (pair.n) {
      printf("%s = %s\n", pair.n, pair.v);
      pair = ini_iter_next(data);
    }
      
    ini_free(data);
  }

  return (0);
}
Beispiel #8
0
void
enna_config_shutdown (void)
{
    Eina_List *l;
    Enna_Config_Section_Parser *p;

    /* save current configuration to file */
    enna_config_save();

    EINA_LIST_FOREACH(cfg_parsers, l, p)
    {
        if (p->free)
            p->free();
        enna_config_section_parser_unregister(p);
    }

    elm_theme_free(enna_config->eth);

    if (cfg_ini)
        ini_free(cfg_ini);
    cfg_ini = NULL;
}
Beispiel #9
0
static void loader_ini_load(void)
{
	ini_t *ini = ini_load(INI_NAME);

	modules = 0;

	if (!ini) return;

	while (ini_seek_section(ini, "loader")) {
		while (ini_seek_setting(ini, NULL)) {
			char *value = ini_value(ini);
			module[modules] = LoadLibrary(value);
			if (module[modules] != NULL) {
				LOG("Loaded %s at %p", value, modules[module]);
				++modules;
			} else {
				LOG("Failed to loaded %s", value);
			}
		}
	}

	ini_free(ini);
}
Beispiel #10
0
int main()
{
    /* $ export MALLOC_TRACE=malloc.log */
    mtrace();

    ini_t *conf = ini_load("test.ini");
    if (conf == NULL)
        error(1, errno, "ini_load fail");

    char *type;
    ini_read_str(conf, "main", "type", &type, "test");
    puts(type);
    free(type);

    char value[100] = { 0 };
    ini_read_strn(conf, "main", "len", value, sizeof(value), NULL);
    puts(value);

    int i;
    ini_read_int(conf, "int", "int", &i, 0);
    unsigned ui;
    ini_read_unsigned(conf, "int", "unsigned", &ui, 0);
    printf("int: %d, unsigned: %u\n", i, ui);

    int8_t  int8;
    ini_read_int8(conf, "int", "int8", &int8, 0);
    uint8_t uint8;
    ini_read_uint8(conf, "int", "uint8", &uint8, 0);
    printf("int8: %i, uint8: %u\n", int8, uint8);

    int16_t int16;
    ini_read_int16(conf, "int", "int16", &int16, 0);
    uint16_t uint16;
    ini_read_uint16(conf, "int", "uint16", &uint16, 0);
    printf("int16: %i, uint16: %u\n", int16, uint16);

    int32_t int32;
    ini_read_int32(conf, "int", "int32", &int32, 0);
    uint32_t uint32;
    ini_read_uint32(conf, "int", "uint32", &uint32, 0);
    printf("int32: %i, uint32: %u\n", int32, uint32);

    int64_t int64;
    ini_read_int64(conf, "int", "int64", &int64, 0);
    uint64_t uint64;
    ini_read_uint64(conf, "int", "uint64", &uint64, 0);
    printf("int64: %"PRIi64", uint64: %"PRIu64"\n", int64, uint64);

    float f;
    ini_read_float(conf, "float", "float", &f, 0);
    double d;
    ini_read_double(conf, "float", "double", &d, 0);
    printf("float: %f, double: %f\n", f, d);

    struct sockaddr_in addr;
    ini_read_ipv4_addr(conf, "addr", "ipv4", &addr, "127.0.0.1:0");
    printf("%s:%u\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));

    char *proc_name = NULL;
    ini_read_str(conf, "global", "proc_name", &proc_name, "test.ini");
    printf("proc_name: %s\n", proc_name);
    free(proc_name);

    char *phone_num = NULL;
    ini_read_str(conf, "damon", "phone num", &phone_num, "123456789");
    printf("phone num: %s\n", phone_num);
    free(phone_num);

    char *city = NULL;
    ini_read_str(conf, "global", "$%^#@!", &city, "shen zhen");
    puts(city);
    free(city);

    char *name = NULL;
    ini_read_str(conf, NULL, "名字", &name, "");
    puts(name);
    free(name);

    ini_free(conf);

    return 0;
}
Beispiel #11
0
struct ini_file *ini_parse(const char *text, int *err, int *line) {
	jmp_buf on_error;
	int e_code;
	
	struct ini_file *ini = NULL;
	ini_section *cur_sec = NULL;
	
	const char *tstart, *tend;
	
	int t;
	
	if(err) *err = SUCCESS;
	if(line) *line = 1;
	
	ini = make_ini();
	
	if((e_code = setjmp(on_error)) != 0) {
		if(err) *err = e_code;
		ini_free(ini);
		return NULL;
	}
	
	while((t = get_token(&text, &tstart, &tend, line, on_error)) != T_END) {
		if(t == '[') {
			char *section_name;
			if(get_token(&text, &tstart, &tend, line, on_error) != T_VALUE) {
				longjmp(on_error, EMPTY_SECTION);				
			}
			
			section_name = get_string(tstart, tend, on_error);
			
			cur_sec = add_section(&ini->sections, section_name);
			if(!cur_sec)
				longjmp(on_error, OUT_OF_MEMORY);
			
			if(get_token(&text, &tstart, &tend, line, on_error) != ']') {
				longjmp(on_error, MISSING_END_BRACE);				
			}
			
		} else if (t == T_VALUE ) {
			char *par, *val;
			par = get_string(tstart, tend, on_error);
			t = get_token(&text, &tstart, &tend, line, on_error);
			if(t != '=' && t != ':') {
				longjmp(on_error, EXPECTED_EQUALS);				
			}
			if(get_token(&text, &tstart, &tend, line, on_error) != T_VALUE) {
				longjmp(on_error, EXPECTED_VALUE);
			}
			val = get_string(tstart, tend, on_error);
			
			if(cur_sec)
				add_pair(cur_sec, par, val);
			else {
				/* Add the parameter and value to the INI file's globals */
				ini_pair *pair;
				if(!(pair = malloc(sizeof *pair)))
					longjmp(on_error, OUT_OF_MEMORY);
				
				pair->param = par;
				pair->value = val;
				
				pair->left = pair->right = NULL;
					
				if(!ini->globals)
					ini->globals = pair;
				else
					insert_pair(ini->globals, pair);
			}
			
			
		} else 
			longjmp(on_error, EXPECTED_PARAMETER);
	}
	
	return ini;
}
Beispiel #12
0
int main(int argc, char *argv[]) {
	int opt;

	int fullscreen = 0, resizable = 0, borderless = 0;

	const char *appTitle = DEFAULT_APP_TITLE;

	const char *game_dir = NULL;
	const char *pak_filename = "game.pak";

	const char *rlog_filename = "rengine.log";

	const char *startstate;

	struct game_state *gs = NULL;

	int demo = 0;

	SDL_version compiled, linked;

	log_init(rlog_filename);
	json_error = rerror;

	if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_AUDIO) < 0) {
		rerror("SDL_Init: %s", SDL_GetError());
		return 1;
	}
	atexit(SDL_Quit);

	while((opt = getopt(argc, argv, "p:g:l:d?")) != -1) {
		switch(opt) {
			case 'p': {
				pak_filename = optarg;
			} break;
			case 'g' : {
				game_dir = optarg;
				pak_filename = NULL;
			} break;
			case 'l': {
				rlog_filename = optarg;
			} break;
			case 'd': {
				demo = 1;
			} break;
			case '?' : {
				usage(argv[0]);
				return 1;
			}
		}
	}

	if(!getcwd(initial_dir, sizeof initial_dir)) {
		rerror("error in getcwd(): %s", strerror(errno));
		return 1;
	}
	rlog("Running engine from %s", initial_dir);

	if(!gdb_new()) {
		rerror("Unable to create Game Database");
		return 1;
	}
	re_initialize();
	states_initialize();
	if(!snd_init()) {
		rerror("Terminating because of audio problem.");
		return 1;
	}

	/* Don't quite know how to use this in Windows yet.
	*/
	SDL_LogSetAllPriority(SDL_LOG_PRIORITY_WARN);
	SDL_Log("Testing Log capability.");
    
	SDL_VERSION(&compiled);
	SDL_GetVersion(&linked);
	rlog("SDL version %d.%d.%d (compile)", compiled.major, compiled.minor, compiled.patch);
	rlog("SDL version %d.%d.%d (link)", linked.major, linked.minor, linked.patch);

	if(!demo) {
		if(pak_filename) {
			rlog("Loading game PAK file: %s", pak_filename);
			if(!rs_read_pak(pak_filename)) {
				rerror("Unable to open PAK file '%s'; Playing demo mode.", pak_filename);
				goto start_demo;
			}
		} else {
			rlog("Not using a PAK file. Using '%s' instead.", game_dir);
			if(chdir(game_dir)) {
				rerror("Unable to change to '%s': %s", game_dir, strerror(errno));
				return 1;
			}
		}

		game_ini = re_get_ini(GAME_INI);
		if(game_ini) {
			appTitle = ini_get(game_ini, "init", "appTitle", "Rengine");

			screenWidth = atoi(ini_get(game_ini, "screen", "width", PARAM(SCREEN_WIDTH)));
			screenHeight = atoi(ini_get(game_ini, "screen", "height", PARAM(SCREEN_HEIGHT)));
			resizable = atoi(ini_get(game_ini, "screen", "resizable", "0")) ? SDL_WINDOW_RESIZABLE : 0;
			borderless = atoi(ini_get(game_ini, "screen", "borderless", "0")) ? SDL_WINDOW_BORDERLESS : 0;
			fullscreen = atoi(ini_get(game_ini, "screen", "fullscreen", "0")) ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0;
			fps = atoi(ini_get(game_ini, "screen", "fps", PARAM(DEFAULT_FPS)));
			if(fps <= 0)
				fps = DEFAULT_FPS;

			filter = !my_stricmp(ini_get(game_ini, "screen", "filter", "nearest"), "linear")? "1": "0";

			virt_width = atoi(ini_get(game_ini, "virtual", "width", PARAM(VIRT_WIDTH)));
			virt_height = atoi(ini_get(game_ini, "virtual", "height", PARAM(VIRT_HEIGHT)));

            show_cursor = atoi(ini_get(game_ini, "mouse", "show-cursor", PARAM(1)))? 1 : 0;

			startstate = ini_get(game_ini, "init", "startstate", NULL);
			if(startstate) {
                gs = get_state(startstate);
				if(!gs) {
					rerror("Unable to get initial state: %s", startstate);
					return 1;
				}
			} else {
				rerror("No initial state in %s", GAME_INI);
				return 1;
			}
		} else {
			rerror("Unable to load %s", GAME_INI);
			return 1;
		}
	} else {
start_demo:
		rlog("Starting demo mode");
		gs = get_demo_state("demo");
	}

	rlog("Initialising...");

	if(!init(appTitle, fullscreen | borderless | resizable)) {
		return 1;
	}
	
	if(!bmf_init()){	
        rlog("Quiting; Unable to start FreeType font library");
        return 1;
	}

    assert(gs);
	rlog("Entering initial state...");
    if(!change_state(gs)) {
        rlog("Quiting, because of earlier problems with the initial state");
        return 1;
    }
	
    frameStart = SDL_GetTicks();

	rlog("Event loop starting...");

	while(!quit) {
		gs = current_state();
		if(!gs) {
			break;
		}

		if(gs->update)
			gs->update(gs, bmp);

		advanceFrame();
	}

	rlog("Event loop stopped.");

	gs = current_state();
	if(gs && gs->deinit)
		gs->deinit(gs);

	bm_free(bmp);

	SDL_DestroyTexture(tex);
	SDL_DestroyRenderer(ren);
	SDL_DestroyWindow(win);

	SDL_Quit();

	ini_free(game_ini);

	re_clean_up();

	bmf_deinit();
	
	gdb_save("dump.db"); /* For testing the game database functionality. Remove later. */

	gdb_close();
	snd_deinit();
	rlog("Engine shut down.");

	return 0;
}
Beispiel #13
0
static void merc_ini_load(void)
{
	char *value;
	int i;
	ini_t *ini = ini_load(INI_NAME);
	if (!ini) {
		LOG("No "INI_NAME" found.");
		return;
	}

	while (ini_seek_section(ini, NULL)) {
		int i;
		char *end;
		char *section = ini_section(ini);

		if (strncasecmp(section, "merc", 4) != 0)
			continue;

		i = strtoul(&section[4], &end, 10) - 1;
		if (!section[4] || *end) continue;
		if (i < 0 || i >= MERCOPT_MAX) continue;

		while (ini_seek_setting(ini, NULL)) {
			char *key = ini_key(ini);
			char *value = ini_value(ini);

			if (strcasecmp(key, "class") == 0) {
				mercopt[i].merc_class = strtoul(value, NULL, 0);
			} else if (strcasecmp(key, "allow_class") == 0) {
				int j;
				int klass[7];
				int klasses = merc_parse_array(value, klass, 7);
				mercopt[i].allow_class = 0;
				for (j = 0; j < klasses; ++j)
					mercopt[i].allow_class |= 1 << klass[j];
			} else if (strcasecmp(key, "allow_2h") == 0) {
				mercopt[i].allow_2h = !!strtoul(value, NULL, 0);
			} else if (strcasecmp(key, "dual") == 0) {
				mercopt[i].dual_types = merc_parse_array(value, mercopt[i].dual_type, MERCOPT_TYPE_MAX);
			} else if (strcasecmp(key, "except") == 0) {
				mercopt[i].except_types = merc_parse_array(value, mercopt[i].except_type, MERCOPT_TYPE_MAX);
			} else if (strcasecmp(key, "allow") == 0) {
				mercopt[i].allow_types = merc_parse_array(value, mercopt[i].allow_type, MERCOPT_TYPE_MAX);
			} else if (strcasecmp(key, "deny") == 0) {
				mercopt[i].deny_types = merc_parse_array(value, mercopt[i].deny_type, MERCOPT_TYPE_MAX);
			} /* else, ignore ( option for new version? :-D ) */
		}
	}

	value = ini_get_setting(ini, "mercmod", "loadmpq");
	if (value) { merc_load_image_mpq = !!strtoul(value, NULL, 0); }

	for (i = 0; i < INVREC_MAX; ++i) {
		char setting[32];
		snprintf(setting, sizeof(setting), "inv%d", i + 1);
		value = ini_get_setting(ini, "mercmod", setting);
		if (value) {
			int j, r;
			int arr[1 + 6*INVENTORY_REC_ITEM_MAX];

			int count = merc_parse_array(value, arr, 1 + 6*INVENTORY_REC_ITEM_MAX);
			if (count <= 0) continue;

			invrec_idx[i] = arr[0];
			for (j = 1, r = 0; j <= (count-6); j += 6) {
				invrec[i][r].left = arr[j];
				invrec[i][r].right = arr[j+1];
				invrec[i][r].top = arr[j+2];
				invrec[i][r].bottom = arr[j+3];
				invrec[i][r].w = arr[j+4];
				invrec[i][r].h = arr[j+5];
			}
		}
	}

	ini_free(ini);
}
Beispiel #14
0
ini_t *ini_load(const char *path)
{
    FILE *fp = fopen(path, "r");
    if (fp == NULL)
        return NULL;

    struct ini_section *head = NULL;
    struct ini_section *prev = NULL;
    struct ini_section *curr = NULL;

    struct ini_arg *arg_curr = NULL;
    struct ini_arg *arg_prev = NULL;

    char *line  = NULL;
    size_t   n  = 0;
    ssize_t len = 0;

    while ((len = _getline(&line, &n, fp)) != -1)
    {
        char *s = line;
        if (is_comment(&s))
            continue;
        len = strlen(s);

        if (len >= 3 && s[0] == '[' && s[len - 1] == ']')
        {
            char *name = s + 1;
            while (isspace(*name))
                ++name;

            char *name_end = s + len - 1;
            *name_end-- = '\0';
            while (isspace(*name_end))
                *name_end-- = '\0';

            if ((curr = find_section(head, name)) == NULL)
            {
                if ((curr = create_section(head, name)) == NULL)
                {
                    free(line);

                    return NULL;
                }

                if (head == NULL)
                    head = curr;
                if (prev != NULL)
                    prev->next = curr;

                prev = curr;
                arg_prev = NULL;
            }
            else
            {
                arg_prev = curr->args;
                while (arg_prev->next != NULL)
                    arg_prev = arg_prev->next;
            }

            continue;
        }

        char *delimiter = strchr(s, '=');
        if (delimiter == NULL)
            continue;
        *delimiter = '\0';

        char *name = s;
        char *name_end = delimiter - 1;
        while (isspace(*name_end))
            *name_end-- = '\0';

        char *value = delimiter + 1;
        while (isspace(*value))
            value++;

        if (curr == NULL)
        {
            if ((curr = create_section(head, "global")) == NULL)
            {
                free(line);

                return NULL;
            }

            if (head == NULL)
                head = curr;
            prev = curr;
            arg_prev = NULL;
        }

        if ((arg_curr = find_arg(curr, name)) == NULL)
        {
            arg_curr = create_arg(head, name, value);
            if (arg_curr == NULL)
            {
                free(line);

                return NULL;
            }

            if (arg_prev)
                arg_prev->next = arg_curr;
            if (curr->args == NULL)
                curr->args = arg_curr;

            arg_prev = arg_curr;
        }
        else
        {
            char *old_value = arg_curr->value;

            if ((arg_curr->value = strdup(value)) == NULL)
            {
                ini_free(head);

                free(line);

                return NULL;
            }

            free(old_value);
        }
    }

    free(line);
    fclose(fp);

    if (head == NULL)
    {
        if ((head = calloc(1, sizeof(struct ini_section))) == NULL)
            return NULL;
    }

    ini_print(head);

    return head;
}
Beispiel #15
0
conf_t *conf_init(void)
{
	conf_t *self;
	ini_t *ini;
	char *tmp, **splitted;
	int nsplits;
	unsigned i;
	dict_t *vars;

	self = xmalloc(sizeof(conf_t));
	self->post_pkgadd = NULL;
	self->ask_for_update = 1;
	self->not_found_policy = ASK;

	ini = ini_new(CONF_FILE);
	ini_add(ini, "ilenia");
	ini_set_default(ini, "ilenia", "post_pkgadd", xstrdup(""));
	ini_set_default(ini, "ilenia", "ask_for_update", xstrdup("1"));
	ini_set_default(ini, "ilenia", "not_found_policy", xstrdup("ASK"));
	ini_set_default(ini, "ilenia", "repositories_hierarchy", xstrdup(""));
	ini_set_default(ini, "ilenia", "enable_colors", xstrdup("Yes"));
	ini_set_default(ini, "ilenia", "verbose", xstrdup("No"));
	ini_add(ini, "favourite_repositories");
	ini_add(ini, "locked_versions");
	ini_add(ini, "aliases");
	ini_add(ini, "pkgmk_confs");
	ini_load(ini);

	if ((tmp = getenv("POST_PKGADD")) == NULL)
		tmp = ini_get(ini, "ilenia", "post_pkgadd");
	self->post_pkgadd = xstrdup(tmp);

	if ((tmp = getenv("ASK_FOR_UPDATE")) == NULL)
		tmp = ini_get(ini, "ilenia", "ask_for_update");
	if (!strcasecmp(tmp, "NO"))
		self->ask_for_update = 0;
	else
		self->ask_for_update = 1;

	if ((tmp = getenv("NOT_FOUND_POLICY")) == NULL)
		tmp = ini_get(ini, "ilenia", "not_found_policy");
	if (!strcasecmp(tmp, "NEVERMIND"))
		self->not_found_policy = NEVERMIND;
	else if (!strcasecmp(tmp, "STOP"))
		self->not_found_policy = STOP;
	else
		self->not_found_policy = ASK;

	tmp = ini_get(ini, "ilenia", "repositories_hierarchy");
	if (tmp != NULL) {
		strreplace(&tmp, "\t", " ", -1);
		while (strstr(tmp, "  "))
			strreplace(&tmp, "  ", " ", -1);

		splitted = NULL;
		nsplits = strsplit(tmp, ' ', &splitted);
		self->repositories_hierarchy =
		    list_new_from_array((void **)splitted, nsplits);
		free(splitted);
	} else
		self->repositories_hierarchy = list_new();

	if ((tmp = getenv("ENABLE_COLORS")) == NULL)
		tmp = ini_get(ini, "ilenia", "enable_colors");
	if (!strcasecmp(tmp, "NO"))
		self->enable_colors = 0;
	else
		self->enable_colors = 1;

	if ((tmp = getenv("VERBOSE")) == NULL)
		tmp = ini_get(ini, "ilenia", "verbose");
	if (strcasecmp(tmp, "Yes") == 0)
		self->verbose = 1;
	else
		self->verbose = 0;

	self->favourite_repositories = dict_new();
	vars = ini_get_vars(ini, "favourite_repositories");

	for (i = 0; vars && i < vars->length; i++)
		dict_add(self->favourite_repositories, vars->elements[i]->key,
			 xstrdup(vars->elements[i]->value));

	self->locked_versions = dict_new();
	vars = ini_get_vars(ini, "locked_versions");
	for (i = 0; vars && i < vars->length; i++)
		dict_add(self->locked_versions, vars->elements[i]->key,
			 xstrdup(vars->elements[i]->value));

	self->aliases = dict_new();
	vars = ini_get_vars(ini, "aliases");
	for (i = 0; vars != NULL && i < vars->length; i++) {
		tmp = vars->elements[i]->value;

		strreplace(&tmp, "\t", " ", -1);
		while (strstr(tmp, "  "))
			strreplace(&tmp, "  ", " ", -1);

		splitted = NULL;
		nsplits = strsplit(tmp, ' ', &splitted);
		if (nsplits == 0)
			continue;
		dict_add(self->aliases, vars->elements[i]->key,
			 list_new_from_array((void **)splitted, nsplits));
		free(splitted);
	}

	self->pkgmk_confs = dict_new();
	vars = ini_get_vars(ini, "pkgmk_confs");

	for (i = 0; vars && i < vars->length; i++)
		dict_add(self->pkgmk_confs, vars->elements[i]->key,
			 xstrdup(vars->elements[i]->value));

	ini_free(ini);
	return self;
}