Source file: /~heha/hsn/vcfsplit.zip/src/main.cpp

/* Splittet .vcf-Datei aus Apple iPhone in einzelne Dateien.
Der Aufruf dieses Programms findet alle *.vcf-Dateien
im aktuellen Verzeichnis und generiert *.vcf-Dateien im Unterverzeichnis vcf.
Dabei werden die Dateinamen aus dem FN:-Eintrag (FullName) gewonnen,
bei mehrfachen Einträgen mit gleichem FN: mit angehängter Nummer in Klammern.
Dabei können Dateien gleichen Inhalts entstehen.
 210920	erstellt, Echse-Größe = 2,5 KByte
-210921	Liste der verbotenen Zeichen bei FAT/NTFS
*/
#include <stdio.h>
#include <wchar.h>
#include <windows.h>	// MultiByteToWideChar()

void mainCRTStartup() {
 WIN32_FIND_DATAW fd;
 HANDLE hf=FindFirstFileW(L"*.vcf",&fd);
 if (hf==INVALID_HANDLE_VALUE) {
  wchar_t msg[256];
  swprintf(msg,L"Kein %s gefunden!",L"*.vcf");
  _wperror(msg);
  exit(1);
 }
 int i=0;
 CreateDirectoryW(L"vcf",0);	// Verzeichnis für Zieldateien (zwecks Ordnung) erstellen
 for(;;){
  FILE*f=_wfopen(fd.cFileName,L"r");
  if (!f) {
   wchar_t msg[256];
   swprintf(msg,L"Kann Datei %s nicht öffnen, Fehlerkode %d!",fd.cFileName,errno);
   _wperror(msg);
  }
  char line[256];
  wchar_t tmpname[16],name[256];
  FILE*f2=0;		// Zieldatei
  while (fgets(line,sizeof line,f)) {
   size_t l=strlen(line);
   if (line[l-1]=='\n') line[--l]=0;	// Lästiges "\n" am Zeilenende entfernen
   if (!strcmp(line,"BEGIN:VCARD")) {	// Bei "Beginn einer VCARD" …
    swprintf(tmpname,L"vcf/%03i.vcf",i);// temporäre Datei erzeugen
    f2=_wfopen(tmpname,L"w");
   }
   if (f2) {
    fprintf(f2,"%s\n",line);		// … alles hineinkopieren
    if (!memcmp(line,"FN:",3)) {	// Zieldateiname (Unicode!!) generieren
     MultiByteToWideChar(CP_UTF8,0,line+3,-1,name,256);	// Gegeben in UTF-8
     for (wchar_t*p=name,*q=name;;p++) {
      if (!wcschr(L"\\/\"*?<>|",*p)) *q++=*p;	// Illegale Win32-Zeichen entfernen
      if (!*p) break;
     }
    }
   }
   if (!strcmp(line,"END:VCARD")) {	// beim Ende Datei schließen …
    if (f2) {
     fclose(f2);
     f2=0;
     i++;
     if (*name) {			// … und (bei Vorhandensein von FN: == FullName) umbenennen
      wchar_t newname[256];
      swprintf(newname,L"vcf/%s.vcf",name);
      bool okay=!_wrename(tmpname,newname);	// manche Fullnames sind mehrfach
      if (!okay && errno==17/*EEXIST*/) {	// nochmal mit angehängter Nummer versuchen
       swprintf(newname,L"vcf/%s (%i).vcf",name,i);
       okay=!_wrename(tmpname,newname);		// jetzt sollte es klappen
      }
      if (!okay) {			// Fehler beim Umbenennen (keine mehr)
       wchar_t msg[256];
       swprintf(msg,L"Fehler %d beim Umbenennen von %s in %s",errno,tmpname,newname);
       _wperror(msg);
      }
      *name=0;
     }
    }
   }
  }
  fclose(f);
  if (!FindNextFileW(hf,&fd)) break;
 }
 FindClose(hf);
 exit(0);
}
Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded