diff --git a/ex17.c b/ex17.c index 45588b2..17f0fc7 100644 --- a/ex17.c +++ b/ex17.c @@ -4,18 +4,20 @@ #include #include -#define MAX_DATA 512 -#define MAX_ROWS 100 +#define DEFAULT_MAX_DATA 512 +#define DEFAULT_MAX_ROWS 100 struct Address { int id; int set; - char name[MAX_DATA]; - char email[MAX_DATA]; + char *name; + char *email; }; struct Database { - struct Address rows[MAX_ROWS]; + int max_data; + int max_rows; + struct Address rows[]; }; struct Connection { @@ -93,11 +95,13 @@ void Database_write(struct Connection *conn) if(rc == -1) die("Cannot flush database.", conn); } -void Database_create(struct Connection *conn) +void Database_create(struct Connection *conn, int max_rows, int max_data) { int i = 0; + conn->db->max_rows = max_rows; + conn->db->max_data = max_data; - for(i = 0; i < MAX_ROWS; i++) { + for(i = 0; i < conn->db->max_rows; i++) { // make a prototype to initialize it struct Address addr = {.id = i, .set = 0}; // then just assign it @@ -107,17 +111,18 @@ void Database_create(struct Connection *conn) void Database_set(struct Connection *conn, int id, const char *name, const char *email) { + int max_data = conn->db->max_data; struct Address *addr = &conn->db->rows[id]; if(addr->set) die("Already set, delete it first", conn); addr->set = 1; - char *res = strncpy(addr->name, name, MAX_DATA); + char *res = strncpy(addr->name, name, max_data); if(!res) die("Name copy failed", conn); - addr->name[MAX_DATA - 1] = '\0'; + addr->name[max_data - 1] = '\0'; - res = strncpy(addr->email, email, MAX_DATA); + res = strncpy(addr->email, email, max_data); if(!res) die("Email copy failed", conn); - addr->email[MAX_DATA - 1] = '\0'; + addr->email[max_data - 1] = '\0'; } void Database_get(struct Connection *conn, int id) @@ -142,7 +147,7 @@ void Database_list(struct Connection *conn) int i = 0; struct Database *db = conn->db; - for(i = 0; i < MAX_ROWS; i++) { + for(i = 0; i < conn->db->max_rows; i++) { struct Address *cur = &db->rows[i]; if(cur->set) { @@ -153,19 +158,27 @@ void Database_list(struct Connection *conn) int main(int argc, char *argv[]) { - if(argc < 3) die("USAGE: ex17 [action params]", NULL); + if(argc < 3) die("USAGE: ex17 [:max_data,max_rows] [action params]", NULL); char *filename = argv[1]; + + int max_data = DEFAULT_MAX_DATA; + int max_rows = DEFAULT_MAX_ROWS; + char action = argv[2][0]; + if(':' == argv[2][1]) { + sscanf(argv[2], "%c:%d,%d", &action, &max_data, &max_rows); + } + struct Connection *conn = Database_open(filename, action); int id = 0; if(argc > 3) id = atoi(argv[3]); - if(id >= MAX_ROWS) die("There's not that many records.", conn); + if(id >= max_rows) die("There's not that many records.", conn); switch(action) { case 'c': - Database_create(conn); + Database_create(conn, max_rows, max_data); Database_write(conn); break;