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; } }
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; } }
/* * 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; }