Universität Ulm, SAI, Übungen zu Systemnahe Software I

Lösungsbeispiel zu Blatt 9 (Aufgabe 13): extract

Dateien vom Archiv in den Arbeitskatalog kopieren.

extract.h

/*
 *      extract.h       - Headerfile for SAM extract function.
 *
 *      Martin Hasch, University of Ulm, January 1997.
 */

#include        "names.h"

/*
 *      Extract given files or everything from archive into working directory.
 *      If any files are not present return ECODE_ERROR, on success
 *      return ECODE_SUCCESS, on serious problems abort program.
 */
int extract(char *archive, names_List list);

extract.c

/*
 *      extract.c       - SAM extract function.
 *
 *      Martin Hasch, University of Ulm, January 1997.
 */

#include        "sam.h"
#include        "names.h"
#include        "parser.h"
#include        "extract.h"

/*
 *      Extract given files or everything from archive into working directory.
 *      If any files are not present return ECODE_ERROR, on success
 *      return ECODE_SUCCESS, on serious problems abort program.
 */
int extract(char *archive, names_List list)
{
        parser_Locator oldarch;
        sam_Header header;
        names_List thisname;
        int all;
        int badfiles = 0;

        all = list == NULL;
        parser_openread(archive, &oldarch);
        while ( parser_getheader(oldarch, &header) ) {
                if ( all || (thisname = names_get(list, header.sam_name)) !=
                                NULL ) {
                        if ( !parser_copyout(oldarch, &header) )
                                ++badfiles;
                        if ( !all )
                                list = names_delete(list, thisname);
                } else {
                        parser_skipbody(oldarch, &header);
                }
        }
        parser_close(oldarch);

        if ( list != NULL ) {
                names_notfound(list);
                return ECODE_ERROR;
        }
        return badfiles? ECODE_ERROR: ECODE_SUCCESS;
}

<- Alle Module
Martin Hasch, Februar 1997