⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 todo_record.c

📁 uclinux 下写的一个 todo 程序
💻 C
字号:
/* *  Copyright (C) 2000 EmSoft Limited (www.emsoftltd.com) * *  <Description of the file> * */#include <stdlib.h>#include <string.h>#include <stdio.h>#include "todo_record.h"#define setLength(sum, array, size) \    array = size; \    sum += array;#define memcpy_with_offset(desc, src, size, ptr) \    memcpy(desc, src, size); \    ptr += size;#define memcpy_offset_desc(desc, src, size) memcpy_with_offset(desc, src, size, desc)#define memcpy_offset_src(desc, src, size) memcpy_with_offset(desc, src, size, src)static int memopad_record_size(Todo *todo, int *fieldSizes) {    int sum = 0;        setLength(sum, fieldSizes[0], sizeof(int));    setLength(sum, fieldSizes[1], sizeof(short));    setLength(sum, fieldSizes[2], sizeof(gboolean));    setLength(sum, fieldSizes[3], sizeof(long));    setLength(sum, fieldSizes[4], strlen(todo->title) + 1);        return sum + sizeof(int) * NUM_OF_FIELDS + 1;}static int serialize(Todo *todo, char**raw_data) {    int length;    int sizes[NUM_OF_FIELDS];    char *ptr;        length = memopad_record_size(todo, sizes);        *raw_data = g_new0(char, length);    ptr = *raw_data;        memcpy_offset_desc(ptr, sizes,                  sizeof(int) * NUM_OF_FIELDS);    memcpy_offset_desc(ptr, &(todo->todo_id),       sizes[0]);    memcpy_offset_desc(ptr, &(todo->priority),      sizes[1]);    memcpy_offset_desc(ptr, &(todo->completed),     sizes[2]);    memcpy_offset_desc(ptr, &(todo->dueDate),       sizes[3]);    memcpy_offset_desc(ptr, todo->title,            sizes[4]);        return length;}void deserialize(Todo **todo, char *raw_data) {    int sizes[NUM_OF_FIELDS];    char *ptr;        ptr = raw_data;    *todo = g_new0(Todo, 1);        memcpy_offset_src(sizes, ptr, sizeof(int) * NUM_OF_FIELDS);        (*todo)->title = g_new0(char, sizes[4]);        memcpy_offset_src(&((*todo)->todo_id),      ptr, sizes[0]);    memcpy_offset_src(&((*todo)->priority),     ptr, sizes[1]);    memcpy_offset_src(&((*todo)->completed),    ptr, sizes[2]);    memcpy_offset_src(&((*todo)->dueDate),      ptr, sizes[3]);    memcpy_offset_src((*todo)->title,           ptr, sizes[4]);}int todo_record_db_open() {    int context;    //char *filename;    //char *path;        /*    path = getenv("DATABASE_PATH");        if (path != NULL) {        filename = g_strconcat(path, "/", TODO_DATABASE, NULL);    } else {        filename = g_strdup(TODO_DATABASE);    }*/        //printf("%s: database file = %s\n", __FUNCTION__, filename);    context = db_open(TODO_DATABASE, DB_WRITER | DB_CREATE_IF_NOT_EXIST);        //g_free(filename);    return context;}void todo_record_db_close(int context) {    db_close(context);}void todo_record_close(int context, Todo *todo) {    if (todo->dirty)        todo_record_save(context, todo);        g_free(todo);}Todo *todo_record_new() {    Todo *todo;    todo = g_new0(Todo, 1);    todo->new = TRUE;    return todo;}Todo *todo_record_load (int context, int key) {    Todo *todo;    char *raw_data;        raw_data = db_fetch(context, key);        g_return_val_if_fail(raw_data != NULL, NULL);        deserialize(&todo, raw_data);        todo->new   = FALSE;    todo->dirty = FALSE;        free(raw_data);        return todo;}int todo_record_save(int context, Todo *todo) {    char *raw_data;    int record_length = 0, result;        if (todo->new)        todo->todo_id = db_getNextKey(context);        record_length = serialize(todo, &raw_data);        result = db_store(context, raw_data, record_length, !(todo->new), &(todo->todo_id));        if (result == 0) {        todo->dirty = FALSE;        todo->new = FALSE;    }        free(raw_data);        return result;}int todo_record_delete(int context, Todo *todo) {    int result;        g_return_val_if_fail(todo != NULL, -1);        result = db_delete(context, todo->todo_id);        return result;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -