Interfaz de Usuario
Esta práctica consiste en implementar una librería en el lenguaje de programación C. con tres funciones, head, tail y longline, que muestran las N líneas por la salida estándar. Existe las diferentes opciones. La siguiente pantalla muestra la ayuda cuando el usuario no haya pasado ningún argumento.
El valor de N es opcional, si no especificamos el valor N, por defecto es 5.
Luego nos pedirá que introduzcamos algunas líneas con el teclado.
Para simplificar el testeo del programa hemos usado pipe.
Esta pantalla es un ejemplo en el que le damos la entrada y le pedimos que muestre las 10 líneas por la salida estándar. La entrada que le pasamos es el resultado del comando ps aux mediante pipe, que es la lista de los procesos en ejecución.
Este ejemplo es lo mismo que antes solo que le pedimos que muestre más líneas.
Si la entrada que le pasamos no tiene suficientes líneas, es decir, menos que N. Muestra todos sus contenidos.
Si los argumentos que haya pasado son ilegales muestra un mensaje de error.
Descripción de código
Head
La función head muestra las N primeras líneas en la salida
estándar recibidas por la entrada.
Necesitamos una estructura
de dato que nos permite guardar los caracteres leídos de una
línea. Utilizamos un puntero a una cadena de caracteres, char *
line.
Reservamos malloc un tamaño mínimo del buffer, capacity
y lo multiplicamos por tamaño de cada caracter sizeof(char) para
establecer el tamaño de la línea, si la línea que tenemos que leer
supera la capacidad actual, duplicamos realloc la capacidad del
buffer.
También necesitamos una variable entera length que se
utiliza como longitud actual de la línea e ir incrementando
length++ cuando leemos más caracteres getchar, si supera el tamaño
de buffer duplicamos. También hemos hecho la comprobación de que
si existe suficiente memoria para leer dichas líneas.
Es
posible que la entrada que nos pase no contiene menos de N líneas.
Por eso tenemos que dividir en casos y hacer el control.
Cuando
llega al final de una línea, guardamos un null char ‘\0’ en la
última posición, reiniciar las variables de control length=0,
ponemos el resultado de la línea leído en la salida y seguir
leyendo hasta N líneas. Al final de la función necesitamos liberar
el puntero.
Tail
La función tail muestra las N últimas líneas en la salida estándar
recibida por la entrada.
Es similar a la función head la
estructura de dato que utilizamos es una lista de cadena de
caracteres char **, entendemos a cadena de caracteres como una
cadena de caracteres char *. La capacidad de la lista es N y la
capacidad de cada cadena está limitado por una variable
capacities. Duplicamos automáticamente el tamaño si es necesario.
Además de una variable para indicar la longitud de la línea actual characterNumber. También tenemos que añadir un índice para llevar la cuenta de líneas leidos lineNumber.
Primero inicializamos la lista de N cadena, vamos leyendo carácter a carácter, cada vez que leemos un carácter aumentamos la variable characterNumber. Si llega al carácter de cambio de línea ‘\n’ añadimos null char al final, reiniciamos el valor carácterNumber a 0, aumentamos lineNumber, y guardamos la línea en la position lineNumber módulo N, así conseguimos reemplazar la última línea laida. Cuando lea la N+1 líneas puedan sustituir la primera línea. Y así cuando llegue al final EOF, envía los N últimos línea leídas al.
Longlines
La función longlines muestra las N líneas más largas recibidas de forma orden de mayor a menor, o todas ellas si hay menos de N líneas, por la entrada de forma ordenada en la salida estándar. Empleamos un procedimiento similar como hacemos en tail. Y cuando el usuario introduzca más de N líneas comprobamos que es más larga que la línea más corta y reordenamos en caso necesario.