int main (int argc, char **argv) { BUFF *bd; char line[20], *str; int num, nmax; if (argc == 1) nmax = NMAX; else nmax = atoi (*++argv); if (!(bd = open_buff (nmax))) { fprintf (stderr, "Invalid size specified\n"); exit (1); } printf ("\n Enter a char to write," " o<num> to read num no. of chars, 'exit' to exit\n"); while (1) { if (buff_full(qd)) printf ("read only: "); else if (buff_empty(qd)) printf ("write only: "); else printf ("read/write: "); if (!fgets (line, 20, stdin)) exit (1); for (str = line; *str == ' ' || *str == '\t'; str++) ; if (!strncmp(str, "exit", 4)) { if (!buff_empty(bd)) printf ("Remaning buffer elements : "); while (!buff_empty(bd)) printf ("%c ", rd_buff(bd)); printf ("\n===>End of App<===\n"); exit (0); } switch (*str) { case '\n' : continue; case 'o': case 'O': if ((num = atoi (str + 1))) { while (num--) { if (!buff_empty(bd)) printf ("%c\n", rd_buff(bd)); else { printf ("Buffer Empty\n"); num = -1; break; } } if (num == -1) continue; } default : if (wrt_buff (bd, *str)) printf ("Buffer Full. read out items first.\n"); break; } } }
/** * Stores string from top of global buffer into a given file * * @param file path * @return NULL */ void *thread_write_with_mutex (void *params) { FILE *fp; char *str; char *file; t_thread_parameters *p; p = (t_thread_parameters *)params; file = malloc(sizeof(strlen(p->file))); strcpy(file, p->file); fp = fopen (file, "w+"); if (fp != NULL) { while ((gl_buff.quit_flag == 0) || (!buff_empty())) { usleep (p->sleep_time); while (buff_empty()) { printf ("drain thread: no new strings in buffer\n"); } sem_wait (&lock); str = buff_read(); if ((strcmp (str, "QUIT")) == 0) { printf ("drain thread: read [QUIT] from buffer\n"); gl_buff.quit_flag = 1; } else { printf ("drain thread: read from buffer\n"); #ifdef DEBUG printf ("read '%s' size of %d\n", str, (int) strlen(str)); #endif fwrite (str, 1, strlen(str), fp); } sem_post (&lock); } } fclose (fp); printf ("drain thread: quitting\n"); return NULL; }
/** * Reads most recently inserted string. Decrements counter * * @return pointer to newly allocated string. NULL if unsuccessful */ char *buff_read() { char *str; if (buff_empty()) { return NULL; } str = gl_buff.buff[--gl_buff.buff_size]; #ifdef DEBUG printf("STRING %s\n", str); #endif return str; }