codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> struct dlist { char *text; struct dlist *next; struct dlist *before; }; void add_text(struct dlist **root, char *text) { struct dlist *p; if ((p = malloc(sizeof(struct dlist))) == NULL) { fprintf(stderr, "cannot allocate enough memory, aborted.\n"); exit(-1); } p->text = text; if (*root == NULL) { *root = p; p->next = p; p->before = p; return; } p->next = *root; p->before = (*root)->before; (*root)->before->next = p; (*root)->before = p; *root = p; } char *get_text(struct dlist **root) { char *text; struct dlist *p; if (*root == NULL) return NULL; if ((*root)->next == (*root)) { text = (*root)->text; free(*root); *root = NULL; return text; } p = (*root)->before; p->before->next = p->next; p->next->before = p->before; text = p->text; free(p); return text; } #define ROW 24 #define COL 80 int main(int argc, char *argv[]) { static char buff[COL + 1]; struct dlist *root; int i, c; char *p; FILE *fp; if (argc != 2) { fprintf(stderr, "usage: %s <file>\n", argv[0]); exit(-1); } if ((fp = fopen(argv[1], "rt")) == NULL) { fprintf(stderr, "%s: cannot open the file \'%s\'.\n", argv[0], argv[1]); exit(-1); } root = NULL; while (fgets(buff, COL + 1, fp) != NULL) { for (p = buff; *p != '\0'; p++) ; if (*(p - 1) == '\n') *(p - 1) = '\0'; p = malloc(strlen(buff) + 1); strcpy(p, buff); add_text(&root, p); } for (;;) { for (i = 0; i < ROW; i++) { p = get_text(&root); if (p == NULL) break; printf("%s\n", p); } if (p == NULL) break; if ((c = getchar()) == 'q') break; } while ((p = get_text(&root)) != NULL) free(p); return 0; } /* end */
Private
[
?
]
Run code
Submit