/* initialize from file */ LinkedList* LinkedList_initWithFile(LinkedList *self, char *fileName, void *(nodeBuilder)(void *)) { FILE *fileHandle; size_t lineLength; char *line; void *nodeData; if (!self) { return 0; } /* initialize defaults */ LinkedList_init(self); /* populate list economy style */ if ((fileHandle = fopen(fileName, "r")) == NULL) { return 0; } while ((line = fgetln(fileHandle, &lineLength)) != NULL) { if (line[0] == '#' || line[0] == '\n') { continue; } if (lineLength > MAX_LINE_BUFFER - 1) { nodeData = malloc(MAX_LINE_BUFFER); strncpy(nodeData, line, MAX_LINE_BUFFER - 1); strncpy(nodeData + MAX_LINE_BUFFER, "\0", 1); } else { nodeData = malloc(lineLength); strncpy(nodeData, line, lineLength - 1); strncpy(nodeData + lineLength, "\0", 1); } LinkedList_push(self, nodeBuilder(nodeData)); } fclose(fileHandle); return self; }
std::unique_ptr<Node> Node::Clone() const { std::unique_ptr<Node> pNode(new Node); NodeBuilder nodeBuilder(*pNode); EmitEvents(nodeBuilder); return pNode; }