Universität Ulm,
SAI,
Übungen zu
Systemnahe Software I
Lösungsbeispiel zu Blatt 9 (Aufgabe 13): replace
Dateien ins Archiv kopieren.
/*
* replace.h - Headerfile for SAM replace function.
*
* Martin Hasch, University of Ulm, January 1997.
*/
#include "names.h"
/*
* Replace given files in archive, create archive if necessary.
* If any files are inaccessible return ECODE_ERROR, on success
* return ECODE_SUCCESS, on serious problems abort program.
*/
int replace(char *archive, names_List list);
/*
* replace.c - SAM replace function.
*
* Martin Hasch, University of Ulm, January 1997.
*/
#include <stdio.h>
#include "sam.h"
#include "names.h"
#include "parser.h"
#include "replace.h"
/*
* Replace given files in archive, create archive if necessary.
* If any files are inaccessible return ECODE_ERROR, on success
* return ECODE_SUCCESS, on serious problems abort program.
*/
int replace(char *archive, names_List list)
{
parser_Locator oldarch;
parser_Locator tmparch;
sam_Header header;
names_List thisname;
int badfiles = 0;
parser_openreadwrite(archive, /*create==*/1, &oldarch, &tmparch);
while ( parser_getheader(oldarch, &header) ) {
if ( (thisname = names_get(list, header.sam_name)) != NULL ) {
if ( parser_copyin(tmparch, thisname->nl_filename,
thisname->nl_name) ) {
parser_skipbody(oldarch, &header);
} else {
++badfiles;
parser_preserve(oldarch, tmparch, &header);
}
list = names_delete(list, thisname);
} else {
parser_preserve(oldarch, tmparch, &header);
}
}
thisname = list;
while ( thisname != NULL ) {
if ( !parser_copyin(tmparch, thisname->nl_filename,
thisname->nl_name) )
++badfiles;
thisname = thisname->nl_next;
}
parser_closeandcopy(oldarch, tmparch);
return badfiles? ECODE_ERROR: ECODE_SUCCESS;
}
<- Alle Module
Martin Hasch, Februar 1997