#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 256
struct Node
{
char line[BUFFER_SIZE];
struct Node* next;
struct Node* prev;
};
struct List
{
struct Node* head;
struct Node* tail;
size_t size;
};
struct Node* createNode(const char line[BUFFER_SIZE], struct Node* parentNode)
{
struct Node
* node
= malloc(sizeof(struct Node
));
node->next = NULL;
node->prev = parentNode;
if(parentNode != NULL)
{
parentNode->next = node;
}
return node;
}
void addLineToList(struct List* list, const char line[BUFFER_SIZE])
{
list->tail = (list->head == NULL) ? list->head = createNode(line, NULL) : createNode(line, list->tail);
++list->size;
}
void printList(struct List* list)
{
struct Node* node = list->head;
printf("Lines: %u\n", list
->size
);
while(node)
{
printf("Line: %s", node
->line
); node = node->next;
}
}
void deleteList(struct List* list)
{
struct Node* node = list->tail;
while(node)
{
struct Node* prevNode = node->prev;
node = prevNode;
}
}
void addLinesToList(struct List* list, FILE* file)
{
char text[BUFFER_SIZE];
while(fgets(text
, BUFFER_SIZE
, file
) != NULL
) {
addLineToList(list, text);
}
}
int main()
{
struct List lineList = { NULL, NULL, 0u };
//addLinesToList(&lineList, fopen("data.txt", "r"));
addLinesToList(&lineList, stdin);
printList(&lineList);
deleteList(&lineList);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBCVUZGRVJfU0laRSAyNTYKCnN0cnVjdCBOb2RlCnsKCWNoYXIgbGluZVtCVUZGRVJfU0laRV07CglzdHJ1Y3QgTm9kZSogbmV4dDsKCXN0cnVjdCBOb2RlKiBwcmV2Owp9OwoKc3RydWN0IExpc3QKewoJc3RydWN0IE5vZGUqIGhlYWQ7CglzdHJ1Y3QgTm9kZSogdGFpbDsKCXNpemVfdCBzaXplOwp9OwoKc3RydWN0IE5vZGUqIGNyZWF0ZU5vZGUoY29uc3QgY2hhciBsaW5lW0JVRkZFUl9TSVpFXSwgc3RydWN0IE5vZGUqIHBhcmVudE5vZGUpCnsKCXN0cnVjdCBOb2RlKiBub2RlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgTm9kZSkpOwoKCXN0cmNweShub2RlLT5saW5lLCBsaW5lKTsKCW5vZGUtPm5leHQgPSBOVUxMOwoJbm9kZS0+cHJldiA9IHBhcmVudE5vZGU7CgoJaWYocGFyZW50Tm9kZSAhPSBOVUxMKQoJewoJCXBhcmVudE5vZGUtPm5leHQgPSBub2RlOwoJfQoKCXJldHVybiBub2RlOwp9Cgp2b2lkIGFkZExpbmVUb0xpc3Qoc3RydWN0IExpc3QqIGxpc3QsIGNvbnN0IGNoYXIgbGluZVtCVUZGRVJfU0laRV0pCnsKCWxpc3QtPnRhaWwgPSAobGlzdC0+aGVhZCA9PSBOVUxMKSA/IGxpc3QtPmhlYWQgPSBjcmVhdGVOb2RlKGxpbmUsIE5VTEwpIDogY3JlYXRlTm9kZShsaW5lLCBsaXN0LT50YWlsKTsKCSsrbGlzdC0+c2l6ZTsKfQoKdm9pZCBwcmludExpc3Qoc3RydWN0IExpc3QqIGxpc3QpCnsKCXN0cnVjdCBOb2RlKiBub2RlID0gbGlzdC0+aGVhZDsKCglwcmludGYoIkxpbmVzOiAldVxuIiwgbGlzdC0+c2l6ZSk7CgoJd2hpbGUobm9kZSkKCXsKCQlwcmludGYoIkxpbmU6ICVzIiwgbm9kZS0+bGluZSk7CgkJbm9kZSA9IG5vZGUtPm5leHQ7Cgl9Cn0KCnZvaWQgZGVsZXRlTGlzdChzdHJ1Y3QgTGlzdCogbGlzdCkKewoJc3RydWN0IE5vZGUqIG5vZGUgPSBsaXN0LT50YWlsOwoKCXdoaWxlKG5vZGUpCgl7CgkJc3RydWN0IE5vZGUqIHByZXZOb2RlID0gbm9kZS0+cHJldjsKCgkJZnJlZShub2RlKTsKCQlub2RlID0gcHJldk5vZGU7Cgl9Cn0KCnZvaWQgYWRkTGluZXNUb0xpc3Qoc3RydWN0IExpc3QqIGxpc3QsIEZJTEUqIGZpbGUpCnsKCWNoYXIgdGV4dFtCVUZGRVJfU0laRV07CgoJd2hpbGUoZmdldHModGV4dCwgQlVGRkVSX1NJWkUsIGZpbGUpICE9IE5VTEwpCgl7CgkJYWRkTGluZVRvTGlzdChsaXN0LCB0ZXh0KTsKCX0KfQoKaW50IG1haW4oKQp7CglzdHJ1Y3QgTGlzdCBsaW5lTGlzdCA9IHsgTlVMTCwgTlVMTCwgMHUgfTsKCgkvL2FkZExpbmVzVG9MaXN0KCZsaW5lTGlzdCwgZm9wZW4oImRhdGEudHh0IiwgInIiKSk7CglhZGRMaW5lc1RvTGlzdCgmbGluZUxpc3QsIHN0ZGluKTsKCXByaW50TGlzdCgmbGluZUxpc3QpOwoJZGVsZXRlTGlzdCgmbGluZUxpc3QpOwoKCXJldHVybiAwOwp9