Universidad de Costa Rica
Escuela de Ciencias de la Computación e Informática
CI-1201 Programación II - 2012b
Profesor Jeisson Hidalgo-Céspedes

Tarea 04

Implemente un comando sort que permita ordenar el contenido de archivos de texto o la entrada estándar. Su programa deberá comportarse como un comando normal de Unix. Si se invoca con el parámetro --help, brindará ayuda al usuario:

$ sort --help
Usage: sort [-inrRW] [FILES]
Writes sorted concatenation of all FILES to stardard output. Options:

  -i  ignores case in comparisons
  -n  considers each line as numbers instead of texts
  -r  reverses the result of comparisons
  -R  sorts randomly the FILES
  -t  trims each line
  -W  overwrites each original FILE instead of writing to standard output
$
Ayuda del programa

Su programa deberá hacer un análisis inicial de los parámetros provistos por el usuario, los cuales se pueden agrupar en cuatro tipos:

El análisis de parámetros incluye las siguientes consideraciones. Si se especifica --help, el programa debe imprimir ayuda en la salida estándar indiferentemente de cuáles otros parámetros se hayan provisto. Si se provee un parámetro no válido, se debe imprimir un mensaje en el error estándar. Si se provee el parámetro -W sin especificar ningún nombre de archivo, será reportado en el error estándar. En cualquiera de estos casos el programa termina su ejecución inmediatamente. Ejemplos:

$ sort -i -W -r -c
sort: -c unknown option
$ sort -i -W -r
sort: -W option and no files were specified
$

Si no se especifican nombres de archivos se asume que el texto será provisto en la entrada estándar y por ende, el resultado será impreso en la salida estándar. Por el contrario, si se proveen nombres de archivo y no la opción -W, el resultado de ordenar todas las líneas de todos los archivos indicados, será impreso en la salida estándar; pero si la opción -W fue especificada, el contenido de cada archivo particular será sobrescrito con su contenido ordenado. En cualquiera de estos casos, se dice que el comando tendrá una fuente de datos para trabajar, indiferentemente de si sean archivos o la entrada estándar; y también un destino de datos donde serán impresas las líneas ordenadas.

El programa debe trabajar a nivel de línea. Es decir, el comando lee líneas de la fuente de datos hasta encontrar el carácter fin de archivo. Cada línea obtenida será agregrada a un contenedor dinámico en memoria. Tras leer todas las líneas de la fuente de datos, se ordenan en el contenedor (si es necesario) y luego se imprime cada línea en el destino de datos. Nótese que cada archivo resultante tendrá la misma cantidad de líneas que el respectivo archivo original.

Si la opción -W es especificada, su programa debe abrir cada archivo indicado por parámetro y el resultado escribirlo en un archivo temporal. Puede utilizar el mismo nombre del archivo original concatenándole la extensión .tmp ó .sort. Para efectos de esta tarea asuma que este archivo temporal no existe, y si existiese, será truncado sin aviso. Una vez terminado el procesamiento, el archivo original es eliminado con la función remove(), y el archivo temporal es renombrado al original con la función rename(), ambas de la biblioteca <stdio.h>.

Evaluación

  1. [20%] Procesa y reacciona adecuadamente a los parámetros de invocación. Asume right sort si no se especifica el tipo de sort. Imprime la ayuda si se especifica --help indiferentemente de los demás parámetros. Imprime error ante una opción no válida o ante un -W sin archivos.
  2. [20%] Si no se espefican archivos en la lista de parámetros, el comando lee líneas de la entrada estándar e imprime los resultados en la salida estándar. Si se especifican archivos y no la opción -W, el comando lee líneas de cada uno de ellos en orden e imprime resultados en la salida estándar.
  3. [20%] Si se especifican archivos y la opción -W, lee líneas de cada uno de ellos en orden e imprime resultados en archivos temporales que luego reemplazan a los originales. Si hay algún error con el manejo de archivos (no existen, no hay espacio en disco, etc.) se reportan en el error estándar. Cierra archivos tan pronto como se dejen de utilizar.
  4. [10%] Por cada línea de la fuente de datos, aplica correctamente los tipos de sort solicitados por el usuario; y las imprime en el destino de datos. Si utiliza fgets() maneja adecuadamente cambios de línea al final de las cadenas devueltas. Si utiliza memoria dinámica no provoca fugas de memoria.
  5. [30%] Las funciones trimLeft(), trimRight() y trimInside() trabajan correctamente, no acceden a memoria no permitida, hacen su trabajo en un único recorrido por la cadena. Retornan un puntero hacia el inicio de la cadena original. Pasan al menos todos los casos de prueba provistos por el profesor.

Para presentar su solución, comprima los archivos fuente que utilizó y súbalos a la plataforma educativa en la asignación con nombre Tarea04.