i4_browse_window_class::i4_browse_window_class(i4_graphical_style_class * style, i4_window_class * title_object, i4_window_class * child_obj, i4_bool show_plus_minus, i4_bool expanded) : style(style), expanded(expanded), i4_parent_window_class(0,0) { toggle_button=0; child_object=0; title_area=new i4_horizontal_compact_window_class(style->color_hint->window.passive.medium, i4_T); ((i4_horizontal_compact_window_class *)title_area)->compact(); i4_parent_window_class::add_child(0,0,title_area); toggle_button=new i4_browse_toggle_class(style, this, show_plus_minus, expanded, (i4_bool)(child_obj!=0)); title_area->add_child(0,0,toggle_button); if (title_object) { add_arranged_child(title_object); } if (child_obj) { replace_object(child_obj); } }
/* * Allocate a new and possibly larger storage space for an obj. */ struct obj * realloc_obj(struct obj *obj, int oextra_size, void *oextra_src, int oname_size, const char *name) { struct obj *otmp; otmp = newobj(oextra_size + oname_size, obj); if (oextra_size) { if (oextra_src) memcpy(otmp->oextra, oextra_src, oextra_size); } else { otmp->oattached = OATTACHED_NOTHING; } otmp->oxlth = oextra_size; otmp->onamelth = oname_size; if (oname_size) { if (name) strcpy(ONAME_MUTABLE(otmp), name); } /* !obj->olev means the obj is currently being restored and no pointer from or to it is valid. Re-equipping, timer linking, etc. will happen elsewhere in that case. */ if (obj->olev) { int i; if (obj->owornmask) { boolean save_twoweap = u.twoweap; /* unwearing the old instance will clear dual-wield mode if this object is either of the two weapons */ setworn(NULL, obj->owornmask); setworn(otmp, otmp->owornmask); u.twoweap = save_twoweap; } /* replace obj with otmp */ replace_object(obj, otmp); /* fix ocontainer pointers */ if (Has_contents(obj)) { struct obj *inside; for (inside = obj->cobj; inside; inside = inside->nobj) inside->ocontainer = otmp; } /* move timers and light sources from obj to otmp */ otmp->timed = 0; /* not timed, yet */ if (obj->timed) obj_move_timers(obj, otmp); otmp->lamplit = 0; /* ditto */ if (obj->lamplit) obj_move_light_source(obj, otmp); /* objects possibly being manipulated by multi-turn occupations which have been interrupted but might be subsequently resumed */ for (i = 0; i <= tos_last_slot; i++) { if (obj == u.utracked[i]) u.utracked[i] = otmp; } /* This is probably paranoia; it would only come up if an item can end up being specific-named as a result of trying to use it. */ for (i = 0; i <= ttos_last_slot; i++) { if (obj == turnstate.tracked[i]) turnstate.tracked[i] = otmp; } } else { /* During restore, floating objects are on the floating objects chain, /but/ may not have OBJ_FREE set. */ otmp->where = obj->where; obj->where = OBJ_FREE; obj->timed = FALSE; obj->lamplit = FALSE; } /* obfree(obj, otmp); now unnecessary: no pointers on bill */ dealloc_obj(obj); /* let us hope nobody else saved a pointer */ return otmp; }
int cmd_replace(int argc, const char **argv, const char *prefix) { int force = 0; int raw = 0; const char *format = NULL; enum { MODE_UNSPECIFIED = 0, MODE_LIST, MODE_DELETE, MODE_EDIT, MODE_GRAFT, MODE_CONVERT_GRAFT_FILE, MODE_REPLACE } cmdmode = MODE_UNSPECIFIED; struct option options[] = { OPT_CMDMODE('l', "list", &cmdmode, N_("list replace refs"), MODE_LIST), OPT_CMDMODE('d', "delete", &cmdmode, N_("delete replace refs"), MODE_DELETE), OPT_CMDMODE('e', "edit", &cmdmode, N_("edit existing object"), MODE_EDIT), OPT_CMDMODE('g', "graft", &cmdmode, N_("change a commit's parents"), MODE_GRAFT), OPT_CMDMODE(0, "convert-graft-file", &cmdmode, N_("convert existing graft file"), MODE_CONVERT_GRAFT_FILE), OPT_BOOL_F('f', "force", &force, N_("replace the ref if it exists"), PARSE_OPT_NOCOMPLETE), OPT_BOOL(0, "raw", &raw, N_("do not pretty-print contents for --edit")), OPT_STRING(0, "format", &format, N_("format"), N_("use this format")), OPT_END() }; check_replace_refs = 0; git_config(git_default_config, NULL); argc = parse_options(argc, argv, prefix, options, git_replace_usage, 0); if (!cmdmode) cmdmode = argc ? MODE_REPLACE : MODE_LIST; if (format && cmdmode != MODE_LIST) usage_msg_opt("--format cannot be used when not listing", git_replace_usage, options); if (force && cmdmode != MODE_REPLACE && cmdmode != MODE_EDIT && cmdmode != MODE_GRAFT && cmdmode != MODE_CONVERT_GRAFT_FILE) usage_msg_opt("-f only makes sense when writing a replacement", git_replace_usage, options); if (raw && cmdmode != MODE_EDIT) usage_msg_opt("--raw only makes sense with --edit", git_replace_usage, options); switch (cmdmode) { case MODE_DELETE: if (argc < 1) usage_msg_opt("-d needs at least one argument", git_replace_usage, options); return for_each_replace_name(argv, delete_replace_ref); case MODE_REPLACE: if (argc != 2) usage_msg_opt("bad number of arguments", git_replace_usage, options); return replace_object(argv[0], argv[1], force); case MODE_EDIT: if (argc != 1) usage_msg_opt("-e needs exactly one argument", git_replace_usage, options); return edit_and_replace(argv[0], force, raw); case MODE_GRAFT: if (argc < 1) usage_msg_opt("-g needs at least one argument", git_replace_usage, options); return create_graft(argc, argv, force, 0); case MODE_CONVERT_GRAFT_FILE: if (argc != 0) usage_msg_opt("--convert-graft-file takes no argument", git_replace_usage, options); return !!convert_graft_file(force); case MODE_LIST: if (argc > 1) usage_msg_opt("only one pattern can be given with -l", git_replace_usage, options); return list_replace_refs(argv[0], format); default: BUG("invalid cmdmode %d", (int)cmdmode); } }
/* * Allocate a new and possibly larger storage space for an obj. */ struct obj *realloc_obj(struct obj *obj, int oextra_size, void *oextra_src, int oname_size, const char *name) { struct obj *otmp; otmp = newobj(oextra_size + oname_size); *otmp = *obj; /* the cobj pointer is copied to otmp */ if (oextra_size) { if (oextra_src) memcpy(otmp->oextra, oextra_src, oextra_size); } else { otmp->oattached = OATTACHED_NOTHING; } otmp->oxlth = oextra_size; otmp->onamelth = oname_size; if (oname_size) { if (name) strcpy(ONAME(otmp), name); } /* !obj->olev means the obj is currently being restored and no pointer * from or to it is valid. Re-equipping, timer linking, etc. will happen * elsewhere in that case. */ if (obj->olev) { if (obj->owornmask) { boolean save_twoweap = u.twoweap; /* unwearing the old instance will clear dual-wield mode if this object is either of the two weapons */ setworn(NULL, obj->owornmask); setworn(otmp, otmp->owornmask); u.twoweap = save_twoweap; } /* replace obj with otmp */ replace_object(obj, otmp); /* fix ocontainer pointers */ if (Has_contents(obj)) { struct obj *inside; for (inside = obj->cobj; inside; inside = inside->nobj) inside->ocontainer = otmp; } /* move timers and light sources from obj to otmp */ otmp->timed = 0; /* not timed, yet */ if (obj->timed) obj_move_timers(obj, otmp); otmp->lamplit = 0; /* ditto */ if (obj->lamplit) obj_move_light_source(obj, otmp); /* objects possibly being manipulated by multi-turn occupations which have been interrupted but might be subsequently resumed */ if (obj->oclass == FOOD_CLASS) food_substitution(obj, otmp); /* eat food or open tin */ else if (obj->oclass == SPBOOK_CLASS) book_substitution(obj, otmp); /* read spellbook */ } else { /* make sure dealloc_obj doesn't explode */ obj->where = OBJ_FREE; obj->timed = FALSE; obj->lamplit = FALSE; } /* obfree(obj, otmp); now unnecessary: no pointers on bill */ dealloc_obj(obj); /* let us hope nobody else saved a pointer */ return otmp; }