static int save_one_dive(git_repository *repo, struct dir *tree, struct dive *dive, struct tm *tm) { struct divecomputer *dc; struct membuffer buf = { 0 }, name = { 0 }; struct dir *subdir; int ret, nr; /* Create dive directory */ create_dive_name(dive, &name, tm); subdir = new_directory(tree, &name); subdir->unique = 1; free_buffer(&name); create_dive_buffer(dive, &buf); nr = dive->number; ret = blob_insert(repo, subdir, &buf, "Dive%c%d", nr ? '-' : 0, nr); if (ret) return report_error("dive save-file tree insert failed"); /* * Save the dive computer data. If there is only one dive * computer, use index 0 for that (which disables the index * generation when naming it). */ dc = &dive->dc; nr = dc->next ? 1 : 0; do { save_one_divecomputer(repo, subdir, dive, dc, nr++); dc = dc->next; } while (dc); return 0; }
static int save_one_divecomputer(git_repository *repo, struct dir *tree, struct dive *dive, struct divecomputer *dc, int idx) { int ret; struct membuffer buf = { 0 }; save_dc(&buf, dive, dc); ret = blob_insert(repo, tree, &buf, "Divecomputer%c%03u", idx ? '-' : 0, idx); if (ret) report_error("divecomputer tree insert failed"); return ret; }
int extract_image(void* user_struct) { struct stream_state stream; struct blob_list blist; struct blob* blob_now = NULL; struct blob* blob_prev = NULL; if (init_pixel_stream(user_struct, &stream)) {printf("init malloc error!\n"); return 1;} if (stream.row == NULL) {printf("row malloc error!\n"); return 1;} blist.length = stream.w + 5; if (malloc_blobs(&blist)) {printf("blob malloc error!\n"); return 1;} while (!next_frame(user_struct, &stream)) { init_blobs(&blist); while (!next_row(user_struct, &stream)) { blob_prev = blist.head->next; while (!stream.wrap) { blob_now = empty_blob(&blist); if (scan_segment(&stream, blob_now)) {blob_reap(&blist, blob_now); continue;} blob_update(blob_now, blob_now->x1, blob_now->x2, stream.y); // update structure sib_find(blist.head->next, blob_now); blob_insert(blob_prev, blob_now); flush_incremental(user_struct, &blist, blob_now); blob_prev = blob_now; } flush_old_blobs(user_struct, &blist, stream.y); //show_status(blist.head, &stream); //show_dead_sibs(blist.head); //show_blobs(blist.head); //printf("----------\n"); } flush_old_blobs(user_struct, &blist, stream.h - 1); } close_pixel_stream(user_struct, &stream); free(blist.head); free(blist.empties); blist.head = NULL; blist.empties = NULL; return 0; }