BUSTED while trying to do extra credit #2
This commit is contained in:
parent
c5a1f90200
commit
ab98180af0
43
ex17.c
43
ex17.c
@ -4,18 +4,20 @@
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#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 <dbfile> <action> [action params]", NULL);
|
||||
if(argc < 3) die("USAGE: ex17 <dbfile> <action>[: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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user