#include #include "book-read-write.h" /* Allocated memory to a book, and allocate strings to initialized by the string constants passed as parameter */ book *make_book(const char *title, const char *author, const char *publisher, int year, int text_book){ static book *result; result = (book*)malloc(sizeof(book)); // strcpy(result->title,title); /* Copy string constants to dynamically allocated strings */ result->title = strcpy((char *)calloc(strlen(title)+1,sizeof(char)), title); result->author = strcpy((char *)calloc(strlen(author)+1,sizeof(char)), author); result->publisher = strcpy((char *)calloc(strlen(publisher)+1,sizeof(char)), publisher); result->publishing_year = year; result->university_text_book = text_book; return result; } /* print book b to standard output */ void prnt_book(book *b){ char *yes_or_no; yes_or_no = (b->university_text_book ? "yes" : "no"); printf("Title: %s\n" "Author: %s\n" "Publisher: %s\n" "Year: %4i\n" "University text book: %s\n\n", b->title, b->author, b->publisher, b->publishing_year, yes_or_no); } char *white_space_protect(char *str){ int str_lgt = strlen(str), i, j; for(i = 0; i < str_lgt; i++){ if (str[i] == ' ') str[i] = PROTECTED_SPACE; else if (str[i] == '\n') str[i] = PROTECTED_NEWLINE; } return str; } char *white_space_deprotect(char *str){ int str_lgt = strlen(str), i; for(i = 0; i < str_lgt; i++){ if (str[i] == PROTECTED_SPACE) str[i] = ' '; else if (str[i] == PROTECTED_NEWLINE) str[i] = '\n'; } return str; } /* Encode the book pointed to by p in the string str */ void encode_book(book *b, char *str){ sprintf(str, "%s %s %s %i %i\n", white_space_protect(b->title), white_space_protect(b->author), white_space_protect(b->publisher), b->publishing_year, b->university_text_book); } book *decode_book(char *str){ char book_title[100], book_author[100], book_publisher[100]; int book_year, book_uni; sscanf(str, "%s %s %s %i %i", book_title, book_author, book_publisher, &book_year, &book_uni); return make_book(white_space_deprotect(book_title), white_space_deprotect(book_author), white_space_deprotect(book_publisher), book_year, book_uni); } void print_book(book *b, FILE *ofp){ char buffer[BUFFER_MAX]; encode_book(b, buffer); fprintf(ofp, "%s", buffer); } book *read_book(FILE *ifp){ char buffer[BUFFER_MAX]; fgets(buffer, BUFFER_MAX, ifp); return decode_book(buffer); }