B.3.  Fehlereliminierungsprogramm

Da aufgrund eines Fehlers in dem kommerziellen Bildauswerteprogramm der Firma Park Scientific Instruments Bilder, die im Modus für Hin- und Rücklauf aufgenommen wurden, mit diesem nicht bearbeitet werden konnten, werden mittels folgendem kleinen Korrekturprogramm bestimmte Bytes im Dateikopf der durch das Bearbeitungsprogramm nicht ladbaren Dateien ausgetauscht, so daß der Fehler nicht mehr auftritt.

/*   park5b_korr.c  
 
Autor: Peter Münster, 1997  
 
Konvertiert Bilder, die im Park-STM-Mode "5B" mit  
Source-Schalter auf "log(I)" aufgenommen wurden, in welche,  
die das Image-Prozeß-Programm laden kann!  
 
*/  
 
 
#include <stdio.h>  
#include "../mystd.h"  
#include <sys/stat.h>  
#include <unistd.h>  
#include <string.h>  
 
#define FILE_SIZE  66560  
 
char progname[DAT_NAME_MAX];  
 
 
// print usage-information and exit  
void usage(void){  
  printf("\nusage: %s file [<files...>]\n\n", progname);  
  printf("Konvertiert Bilder, die im Park-STM-Mode");  
  printf(" \"5B\" mit Source-Schalter auf\n");  
  printf("\"log(I)\" aufgenommen wurden, in welche, ");  
  printf("die das Image-Prozeß-Programm\n");  
  printf("laden kann!\n");  
  exit(1);  
}  
 
 
// Ist das Musterbyte an der gefragten Position?  
int muster(char *file, unsigned char byte, long pos){  
  FILE *fp;  
  unsigned char byte2;  
 
  if(!(fp=fopen(file, "r"))){  
FPF("muster: cannot open %s.\n", file);  
return 0;  
  }  
  if(fseek(fp, pos, SEEK_SET)){  
FPF("muster: cannot reposition pointer of %s.\n",  
  file);  
fclose(fp);  
return 0;  
  }  
  if(fread(&byte2, SOC, 1, fp) != 1){  
FPF("muster: cannot read byte %ld.\n", pos);  
fclose(fp);  
return 0;  
  }  
  fclose(fp);  
#if DEBUG  
  printf("debug: Muster = %X, Gefunden: %X\n", byte, byte2);  
#endif  
  return (byte==byte2);  
}  
 
 
// schreibt Datei neu, indem einige Bytes ausgetaucht werden  
int konvert(char *file){  
  FILE *fp;  
  unsigned char buf[FILE_SIZE];  
 
  if(!(fp=fopen(file, "r+"))){  
FPF("konvert: cannot open %s.\n", file);  
return 0;  
  }  
  // die ersten 0x331 Bytes werden übernommen:  
  if(fread(buf, SOC, 0x331, fp) != 0x331){  
  FPF("konvert: die ersten 0x331 Bytes konnten aus %s "  
  "nicht gelesen werden.\n", file);  
fclose(fp);  
return 0;  
  }  
  // es werden 9 Bytes geschrieben, wo woher 13 waren:  
  strncpy(buf+0x331L, "\x07I CH2,2 ", 9);  
  // Kleine Überprüfung, damit wir es nicht ein  
  // zweites Mal machen (geht damit auch ein Byter weiter):  
  fread(buf+0x33aL, SOC, 1, fp);  // keine Fehlerprüfung !  
  if(buf[0x33aL] == 7){  
FPF("konvert: %s wurde schon konvertiert!\n", file);  
fclose(fp);  
return 0;  
  }  
  // setze FILE-pointer um 12 Bytes weiter  
  // (13, aber 1 bereits durch fread)  
  fseek(fp, 12L, SEEK_CUR);  // keine Fehlerprüfung !  
  if(fread(buf+0x33aL, SOC, FILE_SIZE-0x33eL, fp) !=  
 (FILE_SIZE-0x33eL)){  
  FPF("konvert: die ersten letzten Bytes konnten aus %s "  
  "nicht gelesen werden.\n", file);  
  fclose(fp);  
  return 0;  
  }  
  // nur aus Spaß:  
  strncpy(buf+(FILE_SIZE-4), "hugo", 4);  
  // zurück:  
  rewind(fp);  
  // schreiben des Buffers:  
  if( fwrite(buf, SOC, FILE_SIZE, fp) != FILE_SIZE){  
FPF("konvert: cannot write %ld bytes.\n", FILE_SIZE);  
FPF("konvert: %s is probably corrupt now! ---> EXIT\n",  
  file);  
fclose(fp);  
exit(1);  
  }  
  fclose(fp);  
  return 1;  
}  
 
int main(int argc, char *argv[]){  
  extern char progname[];  
  struct stat statbuf;  
 
  strncpy(progname, argv[0], DAT_NAME_MAX-1);  
 
  if(argc == 1)  // nothing to do  
usage();  
 
  while(--argc){  
if(stat(argv[argc], &statbuf)){  
  FPF("cannot stat %s.\n", argv[argc]);  
  continue;  
}  
#if DEBUG  
  printf("debug: StatBuf.St_Size = %ld.\n", statbuf.st_size);  
#endif  
if(statbuf.st_size != FILE_SIZE){  
  FPF("%s hat nicht die richtige Größe.\n",  
argv[argc]);  
  continue;  
}  
if(muster(argv[argc], 0xdaU, 0x207L))  // Es ist eine  
  if(!konvert(argv[argc]))   // "log(I)-Datei"!  
FPF("Achtung: %s wird NICHT konvertiert!\n",  
  argv[argc]);  
  }  
  return 0;  
}