Esempio n. 1
0
struct string_t *arb_abs2rel(char *path, char *base)
{
	size_t size = 100;
	char *buffer = (char*)malloc(size);
	if(!buffer)
		return NULL;
	
	if(abs2rel(path, base, buffer, size) == buffer)
	{
		struct string_t *string = malloc(sizeof(struct string_t));
		string->text = buffer;
		return string;
	}
	
	while(1)
	{
		size *= 2;
		
		char *new_buffer = (char*)realloc(buffer, size);
		if(!new_buffer)
		{
			free(buffer);
			return NULL;
		}
		
		buffer = new_buffer;
		
		if(abs2rel(path, base, buffer, size) == buffer)
		{
			struct string_t *string = malloc(sizeof(struct string_t));
			string->text = buffer;
			return string;
		}
			
		if(errno != ERANGE)
			return NULL;
	}
}
Esempio n. 2
0
input_t dialog_mouse_command(MEVENT event)
{
	Vector2i pos = abs2rel((Vector2i) { event.y, event.x }, dialog_pos), tl;
	bool del = FALSE;
	color_t i;

	if (cidx != CIDX_DEFAULT) {
		if (area_contains(left_pos, DIALOG_BUTTON_WIDTH, DIALOG_BUTTON_HEIGHT, pos)) {
			picked_turn = TURN_LEFT;
			goto exit;
		}
		if (area_contains(right_pos, DIALOG_BUTTON_WIDTH, DIALOG_BUTTON_HEIGHT, pos)) {
			picked_turn = TURN_RIGHT;
			goto exit;
		}
	}

	if (cidx >= 0 && area_contains(delete_pos, DIALOG_DELETE_WIDTH, DIALOG_DELETE_HEIGHT, pos)) {
		del = TRUE;
		goto exit;
	}

	for (i = 0; i < COLOR_COUNT; i++) {
		tl = get_dialog_tile_pos(i);
		if ((cidx == CIDX_DEFAULT || !color_exists(stgs.colors, i))
				&& area_contains(tl, DIALOG_TILE_SIZE, DIALOG_TILE_SIZE, pos)) {
			picked_color = i;
			goto exit;
		}
	}

	return INPUT_NO_CHANGE;

exit:
	switch (cidx) {
	case CIDX_NEWCOLOR:
		if (picked_color != COLOR_NONE && picked_turn != TURN_NONE) {
			add_color(stgs.colors, picked_color, picked_turn);
			close_dialog();
		}
		return INPUT_MENU_CHANGED;
	case CIDX_DEFAULT:
		assert(stgs.colors && stgs.linked_sim->colors);
		colors_delete(stgs.colors);
		stgs.colors = colors_new(picked_color);
		close_dialog();
		return clear_simulation();
	default:
		if (cidx < 0 || cidx >= COLOR_COUNT) {
			return INPUT_NO_CHANGE;
		}
		if (picked_turn != TURN_NONE) {
			if (picked_color != COLOR_NONE) {
				set_color(stgs.colors, cidx, picked_color, picked_turn);
			} else {
				set_turn(stgs.colors, cidx, picked_turn);
			}
			close_dialog();
			return INPUT_MENU_CHANGED;
		} else if (del) {
			remove_color(stgs.colors, get_color_at(stgs.colors, cidx));
			if (!has_enough_colors(stgs.colors)) {
				simulation_halt(stgs.linked_sim);
			}
			close_dialog();
		}
		return INPUT_MENU_CHANGED;
	}
}
Esempio n. 3
0
/*
 * Path filter for the output of global(1).
 */
static const char *
convert_pathname(CONVERT *cv, const char *path)
{
	static char buf[MAXPATHLEN];
	const char *a, *b;

	if (cv->type != PATH_THROUGH) {
		/*
		 * make absolute path name.
		 * 'path + 1' means skipping "." at the head.
		 */
		strbuf_setlen(cv->abspath, cv->start_point);
		strbuf_puts(cv->abspath, path + 1);
		/*
		 * print path name with converting.
		 */
		switch (cv->type) {
		case PATH_ABSOLUTE:
			path = strbuf_value(cv->abspath);
			break;
		case PATH_RELATIVE:
			a = strbuf_value(cv->abspath);
			b = cv->basedir;
#if defined(_WIN32) || defined(__DJGPP__)
			while (*a != '/')
				a++;
			while (*b != '/')
				b++;
#endif
			if (!abs2rel(a, b, buf, sizeof(buf)))
				die("abs2rel failed. (path=%s, base=%s).", a, b);
			path = buf;
			break;
		default:
			die("unknown path type.");
			break;
		}
	}
	/*
	 * encoding of the path name.
	 */
	if (encoding) {
		const char *p;
		int required = 0;

		for (p = path; *p; p++) {
			if (required_encode(*p)) {
				required = 1;
				break;
			}
		}
		if (required) {
			static char buf[MAXPATHLEN];
			char c[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
			char *q = buf;

			for (p = path; *p; p++) {
				if (required_encode(*p)) {
					*q++ = '%';
					*q++ = c[*p / 16];
					*q++ = c[*p % 16];
				} else
					*q++ = *p;
			}
			*q = '\0';
			path = buf;
		}
	}
	return (const char *)path;
}