Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct movie {
char *title;
int year;
char *genre;
int castsize;
char *actors;
struct movie *next;
};
typedef struct movie movie_t;
FILE *fp;
int calc_actors (char param[][500], int collumn) {
int i, len, actors=1;
len=strlen(*(param+collumn));
for (i=0; i<len; i++) {
if (param[collumn][i]==',') actors++;
}
return actors;
}
void cmd_line(char param[][500], char com[]) {
int words=1, i, j=0, p, k, length=0;
char cmd[500];
for (i=0; i<20; i++) com[i]='\0';
for (p=0; p++; p<4) {
for (i=0; i<500; i++) {
cmd[i]='\0';
param[p][i]='\0';
}
}
i=0;
p=0;
scanf("%500[^\n]s", &cmd);
printf("%s\n", cmd);
while (cmd[i]!='\0') {
if (cmd[i]==' ') {
words++;
} else {
param[4][i]=cmd[i];
}
if (words>1) break;
i++;
}
while (cmd[j]!='\0') {
length++;
j++;
}
printf("\nlength%d, i %d, %d words, com %s\n", length, i, words, *(param+4));
if (words>1) {
while (i<length) {
k=0;
if (cmd[i+1]=='\"') {
i+=2;
for (j=0; j++; j<500) param[p][j]='\0';
while (cmd[i]!='\"') {
param[p][k]=cmd[i];
i++;
k++;
}
i++;
printf("\" %s\n", *(param+p));
} else {
i++;
for (j=0; j++; j<500) param[p][j]='\0';
while (cmd[i]!=' ' && cmd[i]!='\0') {
param[p][k]=cmd[i];
printf("i %d ", i);
i++;
k++;
}
printf("sp %s\n", *(param+p));
}
p++;
printf("p %d\n", p);
}
}
printf("com %s\ntitle %s\nyear %d\ngenre %s\nactors %s\n", com, *(param), atoi(*(param+1)), *(param+2), *(param+3));
}
movie_t *search(movie_t *ptr, char *title, int *flag) {
while((ptr!=NULL) && (strcmp(title, ptr->title)!=0)) {
ptr=ptr->next;
}
if (ptr==NULL) {
*flag=0;
} else {
*flag=1;
}
return ptr;
}
void delete(movie_t *ptr, char *title) {
movie_t *prev;
prev=ptr;
while((ptr!=NULL) && (strcmp(title, ptr->title)!=0)) {
prev=ptr;
ptr=ptr->next;
}
if (ptr!=NULL) {
prev->next=ptr->next;
free(ptr);
}
}
void update(movie_t *ptr, char param[][500]) {
char field[10];
strcpy(field, *(param+1));
if (strcmp(field, "Year")==0) {
ptr->year=atoi(*(param+2));
} else if (strcmp(field, "Genre")==0) {
free(ptr->genre);
ptr->genre = (char*) malloc(strlen(*(param+2)) + 1);
strcpy(ptr->genre, *(param+2));
} else if (strcmp(field, "Actors")==0) {
strcpy(ptr->actors, *(param+2));
ptr->castsize=calc_actors(param, 2);
}
}
int checkcmd(char *com) {
if ((strcmp(com, "add")!=0) &&
(strcmp(com, "delete")!=0) &&
(strcmp(com, "update")!=0) &&
(strcmp(com, "exit")!=0) &&
(strcmp(com, "export")!=0))
{
return 0;
} else {
return 1;
}
}
movie_t *add_movie(char *title, int year, char *genre, int castsize, char *actors, movie_t *ptr) {
movie_t *new;
new=(movie_t *) malloc(sizeof(movie_t));
new->title = (char*) malloc(strlen(title) + 1);
strcpy(new->title, title);
new->year = year;
new->genre = (char*) malloc(strlen(genre) + 1);
strcpy(new->genre, genre);
new->castsize = castsize;
new->actors = (char*) malloc(strlen(actors) + 1);
strcpy(new->actors, actors);
new->next = ptr;
return new;
}
void import_file(char line[], char param[][500]) {
int i, j=0, k, len, last=0, col;
for (i=0; i<4; i++) {
for (j=0; j<500; j++) param[i][j]='\0';
}
i=0;
j=0;
for (col=0; col<3; col++) {
while (line[j]!=',') j++;
for (k=0; i<j; i++, k++) param[col][k]=line[i];
i=j+1;
j++;
}
while (line[i]!='[') i++;
i++;
k=0;
while (line[i]!=']') {
param[3][k]=line[i];
i++;
k++;
}
}
movie_t *initialize(movie_t *ptr, int argc, char **argv, char param[][500],
int year, int castsize, char *title, char *genre, char *actors) {
int i;
char filename[256], line[500];
if (argc==1) {
return NULL;
} else if (argc==3) {
if (strcmp(*(argv+1), "import") == 0) {
snprintf(filename, sizeof(filename), "%s", *(argv+2));
fp=fopen(filename, "r");
fgets(line,500,fp);
do {
for (i=0; i<500; i++) line[i]='\0';
fgets(line, 500, fp);
import_file(line, param);
title=*(param);
year=atoi(*(param+1));
genre=*(param+2);
castsize=calc_actors(param, 3);
actors=*(param+3);
ptr=add_movie(title, year, genre, castsize, actors, ptr);
} while(fgets(line, 500, fp)!=NULL);
fclose(fp);
} else {
exit(0);
}
} else {
exit(0);
}
return ptr;
}
void export(movie_t *ptr, char param[][500]) {
char filename[256];
movie_t *prev, *next;
snprintf(filename, sizeof(filename), "%s", *(param));
fp = fopen(filename, "w");
fprintf(fp, "Title,Year,Genre,CastSize,Actors\n");
prev=NULL;
next=NULL;
while (ptr!=NULL) {
next = ptr->next;
ptr->next = prev;
prev = ptr;
ptr = next;
}
ptr=prev;
while (ptr!=NULL) {
fprintf(fp, "%s,%d,%s,%d,[%s]\n",
ptr->title, ptr->year, ptr->genre, ptr->castsize, ptr->actors);
ptr=ptr->next;
}
fclose(fp);
prev=NULL;
next=NULL;
while (ptr!=NULL) {
next = ptr->next;
ptr->next = prev;
prev = ptr;
ptr = next;
}
ptr=prev;
}
int main (int argc, char *argv[]) {
int year, castsize, i, flag=0, words=1, j=0, p, k, length=0;
char *title, *genre, *actors, cmd[500], com[20], param[5][500], getcmd[500];
movie_t *ptr, *found;
ptr = NULL;
ptr = initialize(ptr, argc, argv, param, year, castsize, title, genre, actors);
do {
for (i=0; i<20; i++) com[i]='\0';
for (p=0; p++; p<4) {
for (i=0; i<500; i++) {
cmd[i]='\0';
param[p][i]='\0';
}
}
i=0;
p=0;
scanf(" %500[^\n]s", &getcmd);
strcpy(cmd, getcmd);
while (cmd[i]!='\0') {
if (cmd[i]==' ') {
words++;
} else {
param[4][i]=cmd[i];
com[i]=param[4][i];
}
if (words>1) break;
i++;
}
while (cmd[j]!='\0') {
length++;
j++;
}
if (words>1) {
while (i<length && p<4) {
k=0;
if (cmd[i+1]=='\"') {
i+=2;
for (j=0; j++; j<500) param[p][j]='\0';
while (cmd[i]!='\"') {
param[p][k]=cmd[i];
i++;
k++;
}
i++;
} else {
i++;
for (j=0; j++; j<500) param[p][j]='\0';
while (cmd[i]!=' ' && cmd[i]!='\0') {
param[p][k]=cmd[i];
i++;
k++;
}
}
p++;
}
}
printf("com %s\ntitle %s\nyear %d\ngenre %s\nactors %s\n", com, *(param), atoi(*(param+1)), *(param+2), *(param+3));
flag=checkcmd(com);
if (flag=0) continue;
if(strcmp(com, "add")==0) {
title=*(param);
year=atoi(*(param+1));
genre=*(param+2);
castsize=calc_actors(param, 3);
actors=*(param+3);
ptr = add_movie(title, year, genre, castsize, actors, ptr);
} else if (strcmp(com, "update")==0) {
title=*(param);
found=search(ptr, title, &flag);
if (flag==0) continue;
if (found==NULL) {
continue;
}
update(found, param);
} else if (strcmp(com, "delete")==0) {
title=*(param);
found=search(ptr, title, &flag);
if (flag=0) continue;
if (found==NULL) {
continue;
}
delete(ptr, title);
} else if (strcmp(com, "export")==0) {
export(ptr, param);
} else {
continue;
}
} while(strcmp(cmd, "exit") != 0);
}