Čitanje linije

Napisati funkciju ssize_t read_line(char **line, size_t *len) koja čita liniju nepoznate dužine.

Ulaz

Sa standardnog ulaza se unose linije porizvoljne dužine sve do kraja unosa.

Izlaz

Na standardni izlaz, za svaku liniju, ispisati dužinu linije i prvih $30$ karaktera linije u formatu:

LEN:<len> TEXT:<line[1..30]>...

Ukoliko linija nema $30$ karaktera ispisati celu liniju bez dodatne tri tačke na kraju.

Primer

Ulaz

For a moment, nothing happened. Then, after a second or so, nothing continued to happen.
Time is an illusion. Lunchtime doubly so.
Space is big. You just won't believe how vastly, hugely, mind-bogglingly big it is. I mean, you may think it's a long way down the road to the chemist's, but that's just peanuts to space.

Don't Panic.

Izlaz

LEN:88 TEXT:For a moment, nothing happened...
LEN:41 TEXT:Time is an illusion. Lunchtime...
LEN:187 TEXT:Space is big. You just won't b...
LEN:0 TEXT:
LEN:12 TEXT:Don't Panic.

Rešenje

main.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define INITIAL_SIZE 8

ssize_t read_line(char **lineptr, size_t *n)
{
	if (*lineptr != NULL) {
		free(*lineptr);
		*lineptr = NULL;
	}

	*n = INITIAL_SIZE;
	*lineptr = malloc(*n * sizeof(char));
	if (*lineptr == NULL) {				   
		return -1;
	}

	ssize_t pos = 0;						
	char c;
	while ((c = getchar()) != EOF) {	
		if (pos + 1 >= *n) { // +1 for null terminator; 
			size_t new_size = *n * 2;		
			char *new_ptr = realloc(*lineptr, new_size * sizeof (char));
			if (new_ptr == NULL) {
				free(*lineptr);
				return -1;
			}
			*lineptr = new_ptr;
			*n = new_size;
		}
		(*lineptr)[pos++] = (char) c;
		if (c == '\n') {
			break;
		}
	}

	if (pos == 0 && c == EOF) {
		return -1;
	}

	(*lineptr)[pos] = '\0';
	return pos;
}

int main(void)
{
	char *line = NULL;
	size_t len = 0;

	ssize_t nread;
	// while ((nread = getline(&line, &len, stdin)) != -1) 
	// getline is POSIX, we implement our own read_line
	while ((nread = read_line(&line, &len)) != -1) {
		printf("LEN:%zd TEXT:", nread - 1);
		if (nread - 1 > 30) {
			for (size_t i = 0; i < 30; i++) {
				putchar(line[i]);
			}
			printf("...\n");
		} else {
			printf("%s\n", line);
		}
	}

	return 0;
}