/* 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;
}
Esempio n. 2
0
	std::unique_ptr<Node> Node::Clone() const
	{
		std::unique_ptr<Node> pNode(new Node);
		NodeBuilder nodeBuilder(*pNode);
		EmitEvents(nodeBuilder);
		return pNode;
	}