UNDO *undo_new(void) { UNDO *undo = NULL; undo = NEW(UNDO); if(undo == NULL) return NULL; undo->memory = undo_memory_new(); if(undo->memory == NULL) { undo_destroy(undo); return NULL; } undo->history = undo_history_new(); if(undo->history == NULL) { undo_destroy(undo); return NULL; } return undo; }
static void diagram_dispose (GObject *object) { Diagram *dia = DIA_DIAGRAM(object); assert(dia->displays==NULL); if (g_list_index(open_diagrams, dia) >= 0) { dia_diagram_remove(dia); open_diagrams = g_list_remove(open_diagrams, dia); layer_dialog_update_diagram_list(); } if (dia->undo) undo_destroy(dia->undo); dia->undo = NULL; diagram_cleanup_autosave(dia); G_OBJECT_CLASS (parent_class)->dispose (object); }
/** Initializes a diagram with standard info and sets it to be called * 'filename'. * Returns TRUE if everything went ok, FALSE otherwise. * Will return FALSE if filename is not a legal string in the current * encoding. */ static gboolean diagram_init(Diagram *dia, const char *filename) { gchar *newfilename = NULL; GError *error = NULL; dia->data = &dia->parent_instance; /* compatibility */ dia->pagebreak_color = prefs.new_diagram.pagebreak_color; get_paper_info (&dia->data->paper, -1, &prefs.new_diagram); dia->grid.width_x = prefs.grid.x; dia->grid.width_y = prefs.grid.y; dia->grid.width_w = prefs.grid.w; dia->grid.hex_size = 1.0; dia->grid.colour = prefs.new_diagram.grid_color; dia->grid.hex = prefs.grid.hex; dia->grid.visible_x = prefs.grid.vis_x; dia->grid.visible_y = prefs.grid.vis_y; dia->grid.dynamic = prefs.grid.dynamic; dia->grid.major_lines = prefs.grid.major_lines; dia->guides.nhguides = 0; dia->guides.hguides = NULL; dia->guides.nvguides = 0; dia->guides.vguides = NULL; if (dia->filename != NULL) g_free(dia->filename); /* Make sure the filename is absolute */ if (!g_path_is_absolute(filename)) { gchar *pwd = g_get_current_dir(); newfilename = g_build_filename(pwd, filename, NULL); g_free(pwd); filename = newfilename; } /* All Diagram functions assumes filename in filesystem encoding */ dia->filename = g_filename_to_utf8(filename, -1, NULL, NULL, &error); if (error != NULL) { message_error(_("Couldn't convert filename '%s' to UTF-8: %s\n"), dia_message_filename(filename), error->message); g_error_free(error); dia->filename = g_strdup(_("Error")); return FALSE; } dia->unsaved = TRUE; dia->mollified = FALSE; dia->autosavefilename = NULL; if (dia->undo) undo_destroy(dia->undo); dia->undo = new_undo_stack(dia); if (!g_list_find(open_diagrams, dia)) open_diagrams = g_list_prepend(open_diagrams, dia); if (app_is_interactive()) layer_dialog_update_diagram_list(); g_free(newfilename); g_signal_connect (G_OBJECT(dia), "object_add", G_CALLBACK(_object_add), dia); g_signal_connect (G_OBJECT(dia), "object_remove", G_CALLBACK(_object_remove), dia); return TRUE; }
int open_file(char *filename) { // open a file (for now, just save_file) // loop vars int i, j; // file pointer FILE *fp; // stream string char *buffer; // data storage char *data; // operation storage char *operation; // name storage char *name; // info storage char *info; // performer storage char *perfnum_buffer; // performer number int perfnum; // exit code int excode; // sizing for allocation int size; // finished flag int done; // placeholder for char int index; // coord number int cnum; // coordinates double x, y; // new operation char *op; // Structures // performer structures perf_t **perfs; perf_t *perf; // Set structure set_t *currset; // open file for reading if (!filename) return -1; if (!(fp = fopen(filename,"r"))) return -1; // check for valid file excode = file_getValidLine(fp, &buffer); if (strcmp(buffer, "#drillwriter")) { // not a valid save file return -1; } free(buffer); // get the name excode = file_getValidLine(fp, &buffer); size = strlen(buffer); name = (char*)malloc((size+2)*sizeof(char)); if (!name) return -1; strncpy(name, buffer, size+1); excode = file_linetoOps(name, &op, '='); free(op); free(buffer); // store name free(pshow->showname); pshow->showname = (char*)malloc((strlen(name)+1)*sizeof(char)); if (!pshow->showname) return -1; strcpy(pshow->showname, name); free(name); // get info excode = file_getValidLine(fp, &buffer); size = strlen(buffer); info = (char*)malloc((size+2)*sizeof(char)); if (!info) return -1; strncpy(info, buffer, size+1); excode = file_linetoOps(info, &op, '='); free(op); free(buffer); // store info free(pshow->showinfo); pshow->showinfo = (char*)malloc((strlen(info)+1)*sizeof(char)); if (!pshow->showinfo) return -1; strcpy(pshow->showinfo, info); free(info); // get perfnum excode = file_getValidLine(fp, &buffer); size = strlen(buffer); perfnum_buffer = (char*)malloc((size+2)*sizeof(char)); if (!perfnum_buffer) return -1; strncpy(perfnum_buffer, buffer, size+1); excode = file_linetoOps(perfnum_buffer, &op, '='); free(op); free(buffer); perfnum = atoi(perfnum_buffer); free(perfnum_buffer); // make the show show_destroy(&pshow); excode = show_construct(&pshow, perfnum); //printf("perfnum = %i\n", perfnum); // build performers buffer = (char*)malloc(sizeof(char)); if (!buffer) return -1; // get performer info perfs = pshow->perfs; perf = perfs[0]; done = 0; i = -1; do { if (i != -1) { if (perfs[i]) perf = perfs[i]; else exit(-1); } // grab performer pieces free(buffer); // get a valid line excode = file_getValidLine(fp, &buffer); size = strlen(buffer); // get operations at data from line data = (char*)malloc((size+2)*sizeof(char)); if (!data) return -1; strncpy(data, buffer, size+1); excode = file_linetoOps(data, &operation, '='); // interpret data based on operation if (!strcmp(operation, "index")) { // info perf->index = atoi(data); i++; } else if (!strcmp(operation, "symbol")) { // symbol free(perf->symbol); perf->symbol = (char*)malloc((size+1)*sizeof(char)); if (!perf->symbol) return -1; strcpy(perf->symbol, data); } else if (!strcmp(operation, "valid")) { // validity flag perf->valid = atoi(data); } else if (!strcmp(operation, "sets:")) { // moving to coords. finished with perfs done = 1; } free(data); free(operation); } while (done == 0); for (i=i+1; i<perfnum; i++) perfs[i]->valid = 0; // go to first set set_first(); currset = pshow->sets->currset; // get set information do { free(buffer); excode = file_getValidLine(fp, &buffer); //printf("buffer = %s\n", buffer); size = strlen(buffer); data = (char*)malloc((size+2)*sizeof(char)); if (!data) return -1; strncpy(data, buffer, size+1); file_linetoOps(data, &operation, '='); //printf("op = %s data = %s\n", operation, data); // find correct operation if (!strcmp(operation, "set")) { // set if (atoi(data) != 0) { // need a new set //add_set(); set_add_after_current(); currset = pshow->sets->currset; } } else if (!strcmp(operation, "counts")) { // counts currset->counts = atoi(data); } else if (!strcmp(operation, "tempo")) { // tempo //printf("changing tempo\n"); //printf("%i: new tempo = %i\n", pstate.setnum, atoi(data)); change_tempo(atoi(data), &pshow->currtempo); update_tempo(); //printf("ping\n"); } else if (!strcmp(operation, "coords:")) { // store coords i = 0; do { free(buffer); excode = file_getValidLine(fp, &buffer); if (excode == -1) exit(-1); else if (!strcmp(buffer, "done")) break; size = strlen(buffer); free(data); data = (char*)malloc((size+2)*sizeof(char)); if (excode == -1) exit(-1); strncpy(data, buffer, size+1); for (j=0; j<size && buffer[j] != ':'; j++) data[j] = buffer[j]; data[j] = '\0'; cnum = atoi(data); j++; // pass any whitespace for (j=j; j<size && buffer[j] == ' '; j++) { } index = j; // get first number for (j=j; j<size && buffer[j] != ' '; j++) { data[j-index] = buffer[j]; } data[j-index] = '\0'; x = atof(data); // pass whitespace for (j=j; j<size && buffer[j] == ' '; j++) { } index = j; // get second number for (j=j; j<size; j++) { data[j-index] = buffer[j]; } data[j-index] = '\0'; y = atof(data); //printf("(x,y) = %i %.2f %.2f\n", cnum, x, y); //printf("valid = %i\n", perfs[i]->valid); //if (perfs[i]->valid != 0) //{ //coords_set_coord(pshow, cnum, x, y); coords_set(pshow->sets->currset->coords[cnum], x, y); //} perf_set_valid(pshow->perfs[i]); i++; } while (i < perfnum); } free(operation); free(data); } while (excode != 1); free(buffer); set_first(); update_tempo(); fclose(fp); // update valid flags //printf("perfnum = %i\n", perfnum); undo_destroy(&pstate.undobr, pshow); return 0; }