コード例 #1
0
ファイル: Idt.c プロジェクト: programble/proxos
Bool Idt_initialize()
{
    idtp.limit = (sizeof(Idt_Entry) * 256) -1;
    idtp.base = (u32) &idt;
    String_set((u8*) &idt, 0, sizeof(Idt_Entry) * 256);
    Idt_load();
    return true;
}
コード例 #2
0
ファイル: String.c プロジェクト: ErikWallstrom/EW_AH
String* String_create(const char* string)
{
	assert(string);
    String* self = malloc(sizeof(String));
    if(!self)
		error(ERROR_ALLOC);
	
	self->raw = NULL;
    String_set(self, string);
    return self;
}
コード例 #3
0
ファイル: TunerControl.c プロジェクト: jamieguinan/cti
static int set_dbfile(Instance *pi, const char *value)
{
  TunerControl_private *priv = (TunerControl_private *)pi;
  String_set(&priv->dbfile, value);

  if (priv->dbschema == String_value_none()) {
    fprintf(stderr, "schema is not set!\n");
    return 1;
  }

  // priv->db = SQLite_open(priv->dbschema, priv->dbfile);

  return 0;
}
コード例 #4
0
int SeqerWindow_loadMidiFile(SeqerWindow_t window, char *filename)
{
	MidiFile_t midi_file = MidiFile_load(filename);
	if (midi_file == NULL) return -1;

	if (PointerArray_getSize(window->document->windows) == 1)
	{
		MidiFile_free(window->document->midi_file);
	}
	else
	{
		int window_number;

		for (window_number = PointerArray_getSize(window->document->windows) - 1; window_number >= 0; window_number--)
		{
			if ((SeqerWindow_t)(PointerArray_get(window->document->windows, window_number)) == window)
			{
				PointerArray_remove(window->document->windows, window_number);
				break;
			}
		}

		window->document = (SeqerDocument_t)(malloc(sizeof (struct SeqerDocument)));
		window->document->windows = PointerArray_new(8);
		window->document->filename = String_new(32);
		PointerArray_add(window->document->windows, window);
	}

	window->document->midi_file = midi_file;
	String_set(window->document->filename, (unsigned char *)(filename));
	window->document->modified = 0;
	window->horizontal_scroll_offset = 0;
	(*(window->application->redraw_callback))(window);

	{
		float last_beat = 0.0;
		MidiFileEvent_t last_event = MidiFile_getLastEvent(window->document->midi_file);
		if (last_event != NULL) last_beat = MidiFile_getBeatFromTick(window->document->midi_file, MidiFileEvent_getTick(last_event));
		(*(window->application->configure_horizontal_scrollbar_callback))(window, (int)(last_beat * 20), 20, window->width, window->horizontal_scroll_offset);
	}

	(*(window->application->configure_vertical_scrollbar_callback))(window, 128 * 5, 5, window->height, window->vertical_scroll_offset);
	(*(window->application->filename_change_callback))(window);
	return 0;
}
コード例 #5
0
ファイル: files.c プロジェクト: BackupTheBerlios/bar-svn
Errors File_getTmpFileNameCString(String fileName, char const *pattern, const String directory)
{
  char   *s;
  int    handle;
  Errors error;

  assert(fileName != NULL);

  if (pattern == NULL) pattern = "tmp-XXXXXX";

  if (directory != NULL)
  {
    String_set(fileName,directory);
    File_appendFileNameCString(fileName,pattern);
  }
  else
  {
    String_setCString(fileName,pattern);
  }
  s = String_toCString(fileName);
  if (s == NULL)
  {
    HALT_INSUFFICIENT_MEMORY();
  }

  handle = mkstemp(s);
  if (handle == -1)
  {
    error = ERRORX(IO_ERROR,errno,s); 
    free(s);
    return error;
  }
  close(handle);

  String_setBuffer(fileName,s,strlen(s));

  free(s);

  return ERROR_NONE;
}
コード例 #6
0
/*---------------------------------------------------------------------*/

void StringList_init(StringList *stringList)
{
  assert(stringList != NULL);

  List_init(stringList);
}

void StringList_done(StringList *stringList)
{
  assert(stringList != NULL);

  List_done(stringList,(ListNodeFreeFunction)freeStringNode,NULL);
}

StringList *StringList_new(void)
{
  return (StringList*)List_new();
}

StringList *StringList_duplicate(const StringList *stringList)
{
  StringList *newStringList;

  assert(stringList != NULL);

  newStringList = StringList_new();
  if (newStringList == NULL)
  {
    return NULL;
  }

  StringList_copy(newStringList,stringList);

  return newStringList;
}

void StringList_copy(StringList *stringList, const StringList *fromStringList)
{
  StringNode *stringNode;

  assert(stringList != NULL);
  assert(fromStringList != NULL);

  stringNode = fromStringList->head;
  while (stringNode != NULL)
  {
    StringList_append(stringList,stringNode->string);
    stringNode = stringNode->next;
  }
}

void StringList_delete(StringList *stringList)
{
  assert(stringList != NULL);

  List_delete(stringList,(ListNodeFreeFunction)freeStringNode,NULL);
}

void StringList_clear(StringList *stringList)
{
  assert(stringList != NULL);

  List_clear(stringList,(ListNodeFreeFunction)freeStringNode,NULL);
}

void StringList_move(StringList *fromStringList, StringList *toStringList)
{
  assert(fromStringList != NULL);
  assert(toStringList != NULL);

  List_move(fromStringList,toStringList,NULL,NULL,NULL);
}

#ifdef NDEBUG
void StringList_insert(StringList *stringList, const String string, StringNode *nextStringNode)
#else /* not NDEBUG */
void __StringList_insert(const char *__fileName__, ulong __lineNb__, StringList *stringList, const String string, StringNode *nextStringNode)
#endif /* NDEBUG */
{
  #ifdef NDEBUG
    insertString(stringList,String_duplicate(string),nextStringNode);
  #else /* not NDEBUG */
    insertString(__fileName__,__lineNb__,stringList,__String_duplicate(__fileName__,__lineNb__,string),nextStringNode);
  #endif /* NDEBUG */
}

#ifdef NDEBUG
void StringList_insertCString(StringList *stringList, const char *s, StringNode *nextStringNode)
#else /* not NDEBUG */
void __StringList_insertCString(const char *__fileName__, ulong __lineNb__, StringList *stringList, const char *s, StringNode *nextStringNode)
#endif /* NDEBUG */
{
  #ifdef NDEBUG
    insertString(stringList,String_newCString(s),nextStringNode);
  #else /* not NDEBUG */
    insertString(__fileName__,__lineNb__,stringList,__String_newCString(__fileName__,__lineNb__,s),nextStringNode);
  #endif /* NDEBUG */
}

#ifdef NDEBUG
void StringList_insertChar(StringList *stringList, char ch, StringNode *nextStringNode)
#else /* not NDEBUG */
void __StringList_insertChar(const char *__fileName__, ulong __lineNb__, StringList *stringList, char ch, StringNode *nextStringNode)
#endif /* NDEBUG */
{
  #ifdef NDEBUG
    insertString(stringList,String_newChar(ch),nextStringNode);
  #else /* not NDEBUG */
    insertString(__fileName__,__lineNb__,stringList,__String_newChar(__fileName__,__lineNb__,ch),nextStringNode);
  #endif /* NDEBUG */
}

#ifdef NDEBUG
void StringList_insertBuffer(StringList *stringList, char *buffer, ulong bufferLength, StringNode *nextStringNode)
#else /* not NDEBUG */
void __StringList_insertBuffer(const char *__fileName__, ulong __lineNb__, StringList *stringList, char *buffer, ulong bufferLength, StringNode *nextStringNode)
#endif /* NDEBUG */
{
  #ifdef NDEBUG
    insertString(stringList,String_newBuffer(buffer,bufferLength),nextStringNode);
  #else /* not NDEBUG */
    insertString(__fileName__,__lineNb__,stringList,__String_newBuffer(__fileName__,__lineNb__,buffer,bufferLength),nextStringNode);
  #endif /* NDEBUG */
}

#ifdef NDEBUG
void StringList_append(StringList *stringList, const String string)
#else /* not NDEBUG */
void __StringList_append(const char *__fileName__, ulong __lineNb__, StringList *stringList, const String string)
#endif /* NDEBUG */
{
  #ifdef NDEBUG
    insertString(stringList,String_duplicate(string),NULL);
  #else /* not NDEBUG */
    insertString(__fileName__,__lineNb__,stringList,__String_duplicate(__fileName__,__lineNb__,string),NULL);
  #endif /* NDEBUG */
}

#ifdef NDEBUG
void StringList_appendCString(StringList *stringList, const char *s)
#else /* not NDEBUG */
void __StringList_appendCString(const char *__fileName__, ulong __lineNb__, StringList *stringList, const char *s)
#endif /* NDEBUG */
{
  #ifdef NDEBUG
    insertString(stringList,String_newCString(s),NULL);
  #else /* not NDEBUG */
    insertString(__fileName__,__lineNb__,stringList,__String_newCString(__fileName__,__lineNb__,s),NULL);
  #endif /* NDEBUG */
}

#ifdef NDEBUG
void StringList_appendChar(StringList *stringList, char ch)
#else /* not NDEBUG */
void __StringList_appendChar(const char *__fileName__, ulong __lineNb__, StringList *stringList, char ch)
#endif /* NDEBUG */
{
  #ifdef NDEBUG
    insertString(stringList,String_newChar(ch),NULL);
  #else /* not NDEBUG */
    insertString(__fileName__,__lineNb__,stringList,__String_newChar(__fileName__,__lineNb__,ch),NULL);
  #endif /* NDEBUG */
}

#ifdef NDEBUG
void StringList_appendBuffer(StringList *stringList, char *buffer, ulong bufferLength)
#else /* not NDEBUG */
void __StringList_appendBuffer(const char *__fileName__, ulong __lineNb__, StringList *stringList, char *buffer, ulong bufferLength)
#endif /* NDEBUG */
{
  #ifdef NDEBUG
    insertString(stringList,String_newBuffer(buffer,bufferLength),NULL);
  #else /* not NDEBUG */
    insertString(__fileName__,__lineNb__,stringList,__String_newBuffer(__fileName__,__lineNb__,buffer,bufferLength),NULL);
  #endif /* NDEBUG */
}

#ifdef NDEBUG
StringNode *StringList_remove(StringList *stringList, StringNode *stringNode)
#else /* not NDEBUG */
StringNode *__StringList_remove(const char *__fileName__, ulong __lineNb__, StringList *stringList, StringNode *stringNode)
#endif /* NDEBUG */
{
  StringNode *nextStringNode;

  assert(stringList != NULL);
  assert(stringNode != NULL);

  nextStringNode = (StringNode*)List_remove(stringList,stringNode);

  String_delete(stringNode->string);
  #ifdef NDEBUG
    stringNode = (StringNode*)LIST_DELETE_NODE(stringNode);
  #else /* not NDEBUG */
    stringNode = (StringNode*)__LIST_DELETE_NODE(__fileName__,__lineNb__,stringNode);
  #endif /* NDEBUG */

  return nextStringNode;
}

#ifdef NDEBUG
String StringList_getFirst(StringList *stringList, String string)
#else /* not NDEBUG */
String __StringList_getFirst(const char *fileName, ulong lineNb, StringList *stringList, String string)
#endif /* NDEBUG */
{
  StringNode *stringNode;

  assert(stringList != NULL);

  stringNode = (StringNode*)List_getFirst(stringList);
  if (stringNode != NULL)
  {
    if (string != NULL)
    {
      String_set(string,stringNode->string);
      String_delete(stringNode->string);
    }
    else
    {
      string = stringNode->string;
    }
    #ifdef NDEBUG
      LIST_DELETE_NODE(stringNode);
    #else /* not NDEBUG */
      __LIST_DELETE_NODE(fileName,lineNb,stringNode);
    #endif /* NDEBUG */

    return string;
  }
  else
  {
    if (string != NULL)
    {
      String_clear(string);
    }

    return NULL;
  }
}

#ifdef NDEBUG
String StringList_getLast(StringList *stringList, String string)
#else /* not NDEBUG */
String __StringList_getLast(const char *fileName, ulong lineNb, StringList *stringList, String string)
#endif /* NDEBUG */
{
  StringNode *stringNode;

  assert(stringList != NULL);

  stringNode = (StringNode*)List_getLast(stringList);
  if (stringNode != NULL)
  {
    if (string != NULL)
    {
      String_set(string,stringNode->string);
      String_delete(stringNode->string);
    }
    else
    {
      string = stringNode->string;
    }
    #ifdef NDEBUG
      LIST_DELETE_NODE(stringNode);
    #else /* not NDEBUG */
      __LIST_DELETE_NODE(fileName,lineNb,stringNode);
    #endif /* NDEBUG */

    return string;
  }
  else
  {
    if (string != NULL)
    {
      String_clear(string);
    }

    return NULL;
  }
}
コード例 #7
0
ファイル: files.c プロジェクト: BackupTheBerlios/bar-svn
Errors File_getTmpDirectoryNameCString(String directoryName, char const *pattern, const String directory)
{
  char   *s;
  Errors error;

  assert(directoryName != NULL);

  if (pattern == NULL) pattern = "tmp-XXXXXX";

  if (directory != NULL)
  {
    String_set(directoryName,directory);
    File_appendFileNameCString(directoryName,pattern);
  }
  else
  {
    String_setCString(directoryName,pattern);
  }
  s = String_toCString(directoryName);
  if (s == NULL)
  {
    HALT_INSUFFICIENT_MEMORY();
  }

  if (mkdtemp(s) == NULL)
  {
    error = ERRORX(IO_ERROR,errno,s);
    free(s);
    return error;
  }

  String_setBuffer(directoryName,s,strlen(s));

  free(s);

  return ERROR_NONE;
}
コード例 #8
0
int SeqerWindow_saveMidiFile(SeqerWindow_t window, char *filename)
{
	if ((filename == NULL) || (filename[0] == '\0'))
	{
		filename = (char *)(String_get(window->document->filename));

		if (filename[0] == '\0')
		{
			return -1;
		}
		else
		{
			return MidiFile_save(window->document->midi_file, filename);
		}
	}
	else
	{
		if (MidiFile_save(window->document->midi_file, filename) < 0)
		{
			return -1;
		}
		else
		{
			int window_number;

			String_set(window->document->filename, (unsigned char *)(filename));

			for (window_number = PointerArray_getSize(window->document->windows) - 1; window_number >= 0; window_number--)
			{
				(*(window->application->filename_change_callback))((SeqerWindow_t)(PointerArray_get(window->document->windows, window_number)));
			}

			return 0;
		}
	}
}
コード例 #9
0
ファイル: files.c プロジェクト: BackupTheBerlios/bar-svn
Errors File_readDirectory(DirectoryHandle *directoryHandle,
                          String          fileName
                         )
{
  assert(directoryHandle != NULL);
  assert(directoryHandle->name != NULL);
  assert(directoryHandle->dir != NULL);
  assert(fileName != NULL);

  /* read entry iff not read */
  if (directoryHandle->entry == NULL)
  {
    directoryHandle->entry = readdir(directoryHandle->dir);
  }

  /* skip "." and ".." entries */
  while (   (directoryHandle->entry != NULL)
         && (   (strcmp(directoryHandle->entry->d_name,"." ) == 0)
             || (strcmp(directoryHandle->entry->d_name,"..") == 0)
            )
        )
  {
    directoryHandle->entry = readdir(directoryHandle->dir);
  }
  if (directoryHandle->entry == NULL)
  {
    return ERRORX(IO_ERROR,errno,String_cString(directoryHandle->name));
  }

  String_set(fileName,directoryHandle->name);
  File_appendFileNameCString(fileName,directoryHandle->entry->d_name);

  directoryHandle->entry = NULL;

  return ERROR_NONE;
}
コード例 #10
0
ファイル: TunerControl.c プロジェクト: jamieguinan/cti
static int set_dbschema(Instance *pi, const char *value)
{
  TunerControl_private *priv = (TunerControl_private *)pi;
  String_set(&priv->dbschema, value);
  return 0;
}
コード例 #11
0
ファイル: TunerControl.c プロジェクト: jamieguinan/cti
static int set_command(Instance *pi, const char *value)
{
  TunerControl_private *priv = (TunerControl_private *)pi;
  String_set(&priv->command, value);
  return 0;
}
コード例 #12
0
ファイル: files.c プロジェクト: BackupTheBerlios/bar-svn
String File_setFileName(String fileName, const String name)
{
  assert(fileName != NULL);

  return String_set(fileName,name);
}
コード例 #13
0
ファイル: files.c プロジェクト: BackupTheBerlios/bar-svn
Errors File_delete(const String fileName, bool recursiveFlag)
{
  struct stat64 fileStat;

  assert(fileName != NULL);

  if (lstat64(String_cString(fileName),&fileStat) != 0)
  {
    return ERRORX(IO_ERROR,errno,String_cString(fileName));
  }

  if      (   S_ISREG(fileStat.st_mode)
           || S_ISLNK(fileStat.st_mode)
          )
  {
    if (unlink(String_cString(fileName)) != 0)
    {
      return ERRORX(IO_ERROR,errno,String_cString(fileName));
    }
  }
  else if (S_ISDIR(fileStat.st_mode))
  {
    Errors        error;
    StringList    directoryList;
    DIR           *dir;
    struct dirent *entry;
    String        directoryName;
    bool          emptyFlag;
    String        name;

    error = ERROR_NONE;
    if (recursiveFlag)
    {
      /* delete entries in directory */
      StringList_init(&directoryList);
      StringList_append(&directoryList,fileName);
      directoryName = File_newFileName();
      name = File_newFileName();
      while (!StringList_empty(&directoryList) && (error == ERROR_NONE))
      {
        StringList_getFirst(&directoryList,directoryName);

        dir = opendir(String_cString(directoryName));
        if (dir != NULL)
        {
          emptyFlag = TRUE;
          while (((entry = readdir(dir)) != NULL) && (error == ERROR_NONE))
          {
            if (   (strcmp(entry->d_name,"." ) != 0)
                && (strcmp(entry->d_name,"..") != 0)
               )
            {
              String_set(name,directoryName);
              File_appendFileNameCString(name,entry->d_name);

              if (lstat64(String_cString(name),&fileStat) == 0)
              {
                if      (   S_ISREG(fileStat.st_mode)
                         || S_ISLNK(fileStat.st_mode)
                        )
                {
                  if (unlink(String_cString(name)) != 0)
                  {
                    error = ERRORX(IO_ERROR,errno,String_cString(name));
                  }
//HALT_INTERNAL_ERROR_STILL_NOT_IMPLEMENTED();
                }
                else if (S_ISDIR(fileStat.st_mode))
                {
                  StringList_append(&directoryList,name);
                  emptyFlag = FALSE;
                }
              }
            }
          }
          closedir(dir);

          if (emptyFlag)
          {
            if (rmdir(String_cString(directoryName)) != 0)
            {
              error = ERRORX(IO_ERROR,errno,String_cString(directoryName));
            }
//HALT_INTERNAL_ERROR_STILL_NOT_IMPLEMENTED();
          }
          else
          {
            StringList_append(&directoryList,directoryName);
          }
        }
      }
      File_deleteFileName(name);
      File_deleteFileName(directoryName);
      StringList_done(&directoryList);
    }
    else
    {
      if (rmdir(String_cString(fileName)) != 0)
      {
        error = ERRORX(IO_ERROR,errno,String_cString(fileName));
      }
    }

    return error;
  }

  return ERROR_NONE;
}
コード例 #14
0
Errors Command_restore(StringList                      *archiveFileNameList,
                       PatternList                     *includePatternList,
                       PatternList                     *excludePatternList,
                       JobOptions                      *jobOptions,
                       ArchiveGetCryptPasswordFunction archiveGetCryptPasswordFunction,
                       void                            *archiveGetCryptPasswordUserData,
                       RestoreStatusInfoFunction       restoreStatusInfoFunction,
                       void                            *restoreStatusInfoUserData,
                       bool                            *pauseFlag,
                       bool                            *requestedAbortFlag
                      )
{
    RestoreInfo       restoreInfo;
    byte              *buffer;
    FileFragmentList  fileFragmentList;
    String            archiveFileName;
    Errors            error;
    ArchiveInfo       archiveInfo;
    ArchiveFileInfo   archiveFileInfo;
    FileTypes         fileType;
    FileFragmentNode  *fileFragmentNode;

    assert(archiveFileNameList != NULL);
    assert(includePatternList != NULL);
    assert(excludePatternList != NULL);
    assert(jobOptions != NULL);

    /* initialize variables */
    restoreInfo.includePatternList           = includePatternList;
    restoreInfo.excludePatternList           = excludePatternList;
    restoreInfo.jobOptions                   = jobOptions;
    restoreInfo.pauseFlag                    = pauseFlag;
    restoreInfo.requestedAbortFlag           = requestedAbortFlag;
    restoreInfo.error                        = ERROR_NONE;
    restoreInfo.statusInfoFunction           = restoreStatusInfoFunction;
    restoreInfo.statusInfoUserData           = restoreStatusInfoUserData;
    restoreInfo.statusInfo.doneFiles         = 0L;
    restoreInfo.statusInfo.doneBytes         = 0LL;
    restoreInfo.statusInfo.skippedFiles      = 0L;
    restoreInfo.statusInfo.skippedBytes      = 0LL;
    restoreInfo.statusInfo.errorFiles        = 0L;
    restoreInfo.statusInfo.errorBytes        = 0LL;
    restoreInfo.statusInfo.fileName          = String_new();
    restoreInfo.statusInfo.fileDoneBytes     = 0LL;
    restoreInfo.statusInfo.fileTotalBytes    = 0LL;
    restoreInfo.statusInfo.storageName       = String_new();
    restoreInfo.statusInfo.storageDoneBytes  = 0LL;
    restoreInfo.statusInfo.storageTotalBytes = 0LL;

    /* allocate resources */
    buffer = malloc(BUFFER_SIZE);
    if (buffer == NULL)
    {
        HALT_INSUFFICIENT_MEMORY();
    }
    FileFragmentList_init(&fileFragmentList);
    archiveFileName = String_new();

    while (   ((restoreInfo.requestedAbortFlag == NULL) || !(*restoreInfo.requestedAbortFlag))
              && !StringList_empty(archiveFileNameList)
              && (restoreInfo.error == ERROR_NONE)
          )
    {
        /* pause */
        while ((restoreInfo.pauseFlag != NULL) && (*restoreInfo.pauseFlag))
        {
            Misc_udelay(500*1000);
        }

        StringList_getFirst(archiveFileNameList,archiveFileName);
        printInfo(0,"Restore archive '%s':\n",String_cString(archiveFileName));

        /* open archive */
        error = Archive_open(&archiveInfo,
                             archiveFileName,
                             jobOptions,
                             archiveGetCryptPasswordFunction,
                             archiveGetCryptPasswordUserData
                            );
        if (error != ERROR_NONE)
        {
            printError("Cannot open archive file '%s' (error: %s)!\n",
                       String_cString(archiveFileName),
                       Errors_getText(error)
                      );
            if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error;
            continue;
        }
        String_set(restoreInfo.statusInfo.storageName,archiveFileName);
        updateStatusInfo(&restoreInfo);

        /* read files */
        while (   ((restoreInfo.requestedAbortFlag == NULL) || !(*restoreInfo.requestedAbortFlag))
                  && !Archive_eof(&archiveInfo)
                  && (restoreInfo.error == ERROR_NONE)
              )
        {
            /* pause */
            while ((restoreInfo.pauseFlag != NULL) && (*restoreInfo.pauseFlag))
            {
                Misc_udelay(500*1000);
            }

            /* get next file type */
            error = Archive_getNextFileType(&archiveInfo,
                                            &archiveFileInfo,
                                            &fileType
                                           );
            if (error != ERROR_NONE)
            {
                printError("Cannot not read next entry in archive '%s' (error: %s)!\n",
                           String_cString(archiveFileName),
                           Errors_getText(error)
                          );
                if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error;
                break;
            }

            switch (fileType)
            {
            case FILE_TYPE_FILE:
            {
                String           fileName;
                FileInfo         fileInfo;
                uint64           fragmentOffset,fragmentSize;
                FileFragmentNode *fileFragmentNode;
                String           destinationFileName;
                String           directoryName;
//            FileInfo         localFileInfo;
                FileHandle       fileHandle;
                uint64           length;
                ulong            n;

                /* read file */
                fileName = String_new();
                error = Archive_readFileEntry(&archiveInfo,
                                              &archiveFileInfo,
                                              NULL,
                                              NULL,
                                              NULL,
                                              fileName,
                                              &fileInfo,
                                              &fragmentOffset,
                                              &fragmentSize
                                             );
                if (error != ERROR_NONE)
                {
                    printError("Cannot not read 'file' content of archive '%s' (error: %s)!\n",
                               String_cString(archiveFileName),
                               Errors_getText(error)
                              );
                    String_delete(fileName);
                    if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error;
                    continue;
                }

                if (   (List_empty(includePatternList) || PatternList_match(includePatternList,fileName,PATTERN_MATCH_MODE_EXACT))
                        && !PatternList_match(excludePatternList,fileName,PATTERN_MATCH_MODE_EXACT)
                   )
                {
                    String_set(restoreInfo.statusInfo.fileName,fileName);
                    restoreInfo.statusInfo.fileDoneBytes = 0LL;
                    restoreInfo.statusInfo.fileTotalBytes = fragmentSize;
                    updateStatusInfo(&restoreInfo);

                    /* get destination filename */
                    destinationFileName = getDestinationFileName(String_new(),
                                          fileName,
                                          jobOptions->directory,
                                          jobOptions->directoryStripCount
                                                                );


                    /* check if file fragment exists */
                    fileFragmentNode = FileFragmentList_findFile(&fileFragmentList,fileName);
                    if (fileFragmentNode != NULL)
                    {
                        if (!jobOptions->overwriteFilesFlag && FileFragmentList_checkExists(fileFragmentNode,fragmentOffset,fragmentSize))
                        {
                            printInfo(1,"  Restore file '%s'...skipped (file part %ll..%ll exists)\n",
                                      String_cString(destinationFileName),
                                      fragmentOffset,
                                      (fragmentSize > 0)?fragmentOffset+fragmentSize-1:fragmentOffset
                                     );
                            String_delete(destinationFileName);
                            Archive_closeEntry(&archiveFileInfo);
                            String_delete(fileName);
                            continue;
                        }
                    }
                    else
                    {
                        if (!jobOptions->overwriteFilesFlag && File_exists(destinationFileName))
                        {
                            printInfo(1,"  Restore file '%s'...skipped (file exists)\n",String_cString(destinationFileName));
                            String_delete(destinationFileName);
                            Archive_closeEntry(&archiveFileInfo);
                            String_delete(fileName);
                            continue;
                        }
                        fileFragmentNode = FileFragmentList_addFile(&fileFragmentList,fileName,fileInfo.size);
                    }

                    printInfo(2,"  Restore file '%s'...",String_cString(destinationFileName));

                    /* create directory if not existing */
                    directoryName = File_getFilePathName(String_new(),destinationFileName);
                    if (!File_exists(directoryName))
                    {
                        /* create directory */
                        error = File_makeDirectory(directoryName,
                                                   FILE_DEFAULT_USER_ID,
                                                   FILE_DEFAULT_GROUP_ID,
                                                   fileInfo.permission
                                                  );
                        if (error != ERROR_NONE)
                        {
                            printInfo(2,"FAIL!\n");
                            printError("Cannot create directory '%s' (error: %s)\n",
                                       String_cString(directoryName),
                                       Errors_getText(error)
                                      );
                            String_delete(directoryName);
                            String_delete(destinationFileName);
                            Archive_closeEntry(&archiveFileInfo);
                            String_delete(fileName);
                            if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error;
                            continue;
                        }

                        /* set owner ship */
                        error = File_setOwner(directoryName,
                                              (jobOptions->owner.userId  != FILE_DEFAULT_USER_ID )?jobOptions->owner.userId:fileInfo.userId,
                                              (jobOptions->owner.groupId != FILE_DEFAULT_GROUP_ID)?jobOptions->owner.groupId:fileInfo.groupId
                                             );
                        if (error != ERROR_NONE)
                        {
                            if (jobOptions->stopOnErrorFlag)
                            {
                                printInfo(2,"FAIL!\n");
                                printError("Cannot set owner ship of directory '%s' (error: %s)\n",
                                           String_cString(directoryName),
                                           Errors_getText(error)
                                          );
                                String_delete(directoryName);
                                String_delete(destinationFileName);
                                Archive_closeEntry(&archiveFileInfo);
                                String_delete(fileName);
                                if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error;
                                continue;
                            }
                            else
                            {
                                printWarning("Cannot set owner ship of directory '%s' (error: %s)\n",
                                             String_cString(directoryName),
                                             Errors_getText(error)
                                            );
                            }
                        }
                    }
                    String_delete(directoryName);

                    /* write file data */
//if (fileFragmentNode == NULL) File_delete(destinationFileName,TRUE);
                    error = File_open(&fileHandle,destinationFileName,FILE_OPENMODE_WRITE);
                    if (error != ERROR_NONE)
                    {
                        printInfo(2,"FAIL!\n");
                        printError("Cannot create/write to file '%s' (error: %s)\n",
                                   String_cString(destinationFileName),
                                   Errors_getText(error)
                                  );
                        String_delete(destinationFileName);
                        Archive_closeEntry(&archiveFileInfo);
                        String_delete(fileName);
                        if (jobOptions->stopOnErrorFlag)
                        {
                            restoreInfo.error = error;
                        }
                        continue;
                    }
                    error = File_seek(&fileHandle,fragmentOffset);
                    if (error != ERROR_NONE)
                    {
                        printInfo(2,"FAIL!\n");
                        printError("Cannot write file '%s' (error: %s)\n",
                                   String_cString(destinationFileName),
                                   Errors_getText(error)
                                  );
                        File_close(&fileHandle);
                        String_delete(destinationFileName);
                        Archive_closeEntry(&archiveFileInfo);
                        String_delete(fileName);
                        if (jobOptions->stopOnErrorFlag)
                        {
                            restoreInfo.error = error;
                        }
                        continue;
                    }

                    length = 0;
                    while (   ((restoreInfo.requestedAbortFlag == NULL) || !(*restoreInfo.requestedAbortFlag))
                              && (length < fragmentSize)
                          )
                    {
                        /* pause */
                        while ((restoreInfo.pauseFlag != NULL) && (*restoreInfo.pauseFlag))
                        {
                            Misc_udelay(500*1000);
                        }

                        n = MIN(fragmentSize-length,BUFFER_SIZE);

                        error = Archive_readFileData(&archiveFileInfo,buffer,n);
                        if (error != ERROR_NONE)
                        {
                            printInfo(2,"FAIL!\n");
                            printError("Cannot not read content of archive '%s' (error: %s)!\n",
                                       String_cString(archiveFileName),
                                       Errors_getText(error)
                                      );
                            if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error;
                            break;
                        }
                        error = File_write(&fileHandle,buffer,n);
                        if (error != ERROR_NONE)
                        {
                            printInfo(2,"FAIL!\n");
                            printError("Cannot write file '%s' (error: %s)\n",
                                       String_cString(destinationFileName),
                                       Errors_getText(error)
                                      );
                            if (jobOptions->stopOnErrorFlag)
                            {
                                restoreInfo.error = error;
                            }
                            break;
                        }
                        restoreInfo.statusInfo.fileDoneBytes += n;
                        updateStatusInfo(&restoreInfo);

                        length += n;
                    }
                    if (File_getSize(&fileHandle) > fileInfo.size)
                    {
                        File_truncate(&fileHandle,fileInfo.size);
                    }
                    File_close(&fileHandle);
                    if ((restoreInfo.requestedAbortFlag != NULL) && (*restoreInfo.requestedAbortFlag))
                    {
                        printInfo(2,"ABORTED\n");
                        String_delete(destinationFileName);
                        Archive_closeEntry(&archiveFileInfo);
                        String_delete(fileName);
                        continue;
                    }
#if 0
                    if (restoreInfo.error != ERROR_NONE)
                    {
                        String_delete(destinationFileName);
                        Archive_closeEntry(&archiveFileInfo);
                        String_delete(fileName);
                        continue;
                    }
#endif /* 0 */

                    /* set file time, file owner/group */
                    if (jobOptions->owner.userId  != FILE_DEFAULT_USER_ID ) fileInfo.userId  = jobOptions->owner.userId;
                    if (jobOptions->owner.groupId != FILE_DEFAULT_GROUP_ID) fileInfo.groupId = jobOptions->owner.groupId;
                    error = File_setFileInfo(destinationFileName,&fileInfo);
                    if (error != ERROR_NONE)
                    {
                        if (jobOptions->stopOnErrorFlag)
                        {
                            printInfo(2,"FAIL!\n");
                            printError("Cannot set file info of '%s' (error: %s)\n",
                                       String_cString(destinationFileName),
                                       Errors_getText(error)
                                      );
                            String_delete(destinationFileName);
                            Archive_closeEntry(&archiveFileInfo);
                            String_delete(fileName);
                            restoreInfo.error = error;
                            continue;
                        }
                        else
                        {
                            printWarning("Cannot set file info of '%s' (error: %s)\n",
                                         String_cString(destinationFileName),
                                         Errors_getText(error)
                                        );
                        }
                    }

                    /* add fragment to file fragment list */
                    FileFragmentList_add(fileFragmentNode,fragmentOffset,fragmentSize);
//FileFragmentList_print(fileFragmentNode,String_cString(fileName));

                    /* discard fragment list if file is complete */
                    if (FileFragmentList_checkComplete(fileFragmentNode))
                    {
                        FileFragmentList_removeFile(&fileFragmentList,fileFragmentNode);
                    }

                    /* free resources */
                    String_delete(destinationFileName);

                    printInfo(2,"ok\n");
                }
                else
                {
                    /* skip */
                    printInfo(3,"  Restore '%s'...skipped\n",String_cString(fileName));
                }

                /* close archive file, free resources */
                Archive_closeEntry(&archiveFileInfo);
                String_delete(fileName);
            }
            break;
            case FILE_TYPE_DIRECTORY:
            {
                String   directoryName;
                FileInfo fileInfo;
                String   destinationFileName;
//            FileInfo localFileInfo;

                /* read directory */
                directoryName = String_new();
                error = Archive_readDirectoryEntry(&archiveInfo,
                                                   &archiveFileInfo,
                                                   NULL,
                                                   NULL,
                                                   directoryName,
                                                   &fileInfo
                                                  );
                if (error != ERROR_NONE)
                {
                    printError("Cannot not read 'directory' content of archive '%s' (error: %s)!\n",
                               String_cString(archiveFileName),
                               Errors_getText(error)
                              );
                    String_delete(directoryName);
                    if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error;
                    break;
                }

                if (   (List_empty(includePatternList) || PatternList_match(includePatternList,directoryName,PATTERN_MATCH_MODE_EXACT))
                        && !PatternList_match(excludePatternList,directoryName,PATTERN_MATCH_MODE_EXACT)
                   )
                {
                    String_set(restoreInfo.statusInfo.fileName,directoryName);
                    restoreInfo.statusInfo.fileDoneBytes = 0LL;
                    restoreInfo.statusInfo.fileTotalBytes = 00L;
                    updateStatusInfo(&restoreInfo);

                    /* get destination filename */
                    destinationFileName = getDestinationFileName(String_new(),
                                          directoryName,
                                          jobOptions->directory,
                                          jobOptions->directoryStripCount
                                                                );


                    /* check if directory already exists */
                    if (!jobOptions->overwriteFilesFlag && File_exists(destinationFileName))
                    {
                        printInfo(1,
                                  "  Restore directory '%s'...skipped (file exists)\n",
                                  String_cString(destinationFileName)
                                 );
                        String_delete(destinationFileName);
                        Archive_closeEntry(&archiveFileInfo);
                        String_delete(directoryName);
                        continue;
                    }

                    printInfo(2,"  Restore directory '%s'...",String_cString(destinationFileName));

                    /* create directory */
                    error = File_makeDirectory(destinationFileName,
                                               FILE_DEFAULT_USER_ID,
                                               FILE_DEFAULT_GROUP_ID,
                                               fileInfo.permission
                                              );
                    if (error != ERROR_NONE)
                    {
                        printInfo(2,"FAIL!\n");
                        printError("Cannot create directory '%s' (error: %s)\n",
                                   String_cString(destinationFileName),
                                   Errors_getText(error)
                                  );
                        String_delete(destinationFileName);
                        Archive_closeEntry(&archiveFileInfo);
                        String_delete(directoryName);
                        if (jobOptions->stopOnErrorFlag)
                        {
                            restoreInfo.error = error;
                        }
                        continue;
                    }

                    /* set file time, file owner/group */
                    if (jobOptions->owner.userId  != FILE_DEFAULT_USER_ID ) fileInfo.userId  = jobOptions->owner.userId;
                    if (jobOptions->owner.groupId != FILE_DEFAULT_GROUP_ID) fileInfo.groupId = jobOptions->owner.groupId;
                    error = File_setFileInfo(destinationFileName,&fileInfo);
                    if (error != ERROR_NONE)
                    {
                        if (jobOptions->stopOnErrorFlag)
                        {
                            printInfo(2,"FAIL!\n");
                            printError("Cannot set directory info of '%s' (error: %s)\n",
                                       String_cString(destinationFileName),
                                       Errors_getText(error)
                                      );
                            String_delete(destinationFileName);
                            Archive_closeEntry(&archiveFileInfo);
                            String_delete(directoryName);
                            if (jobOptions->stopOnErrorFlag)
                            {
                                restoreInfo.error = error;
                            }
                            continue;
                        }
                        else
                        {
                            printWarning("Cannot set directory info of '%s' (error: %s)\n",
                                         String_cString(destinationFileName),
                                         Errors_getText(error)
                                        );
                        }
                    }

                    /* free resources */
                    String_delete(destinationFileName);

                    printInfo(2,"ok\n");
                }
                else
                {
                    /* skip */
                    printInfo(3,"  Restore '%s'...skipped\n",String_cString(directoryName));
                }

                /* close archive file */
                Archive_closeEntry(&archiveFileInfo);
                String_delete(directoryName);
            }
            break;
            case FILE_TYPE_LINK:
            {
                String   linkName;
                String   fileName;
                FileInfo fileInfo;
                String   destinationFileName;
//            FileInfo localFileInfo;

                /* read link */
                linkName = String_new();
                fileName = String_new();
                error = Archive_readLinkEntry(&archiveInfo,
                                              &archiveFileInfo,
                                              NULL,
                                              NULL,
                                              linkName,
                                              fileName,
                                              &fileInfo
                                             );
                if (error != ERROR_NONE)
                {
                    printError("Cannot not read 'link' content of archive '%s' (error: %s)!\n",
                               String_cString(archiveFileName),
                               Errors_getText(error)
                              );
                    String_delete(fileName);
                    String_delete(linkName);
                    if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error;
                    break;
                }

                if (   (List_empty(includePatternList) || PatternList_match(includePatternList,linkName,PATTERN_MATCH_MODE_EXACT))
                        && !PatternList_match(excludePatternList,linkName,PATTERN_MATCH_MODE_EXACT)
                   )
                {
                    String_set(restoreInfo.statusInfo.fileName,linkName);
                    restoreInfo.statusInfo.fileDoneBytes = 0LL;
                    restoreInfo.statusInfo.fileTotalBytes = 00L;
                    updateStatusInfo(&restoreInfo);

                    /* get destination filename */
                    destinationFileName = getDestinationFileName(String_new(),
                                          linkName,
                                          jobOptions->directory,
                                          jobOptions->directoryStripCount
                                                                );


                    /* create link */
                    if (!jobOptions->overwriteFilesFlag && File_exists(destinationFileName))
                    {
                        printInfo(1,
                                  "  Restore link '%s'...skipped (file exists)\n",
                                  String_cString(destinationFileName)
                                 );
                        String_delete(destinationFileName);
                        Archive_closeEntry(&archiveFileInfo);
                        String_delete(fileName);
                        String_delete(linkName);
                        if (jobOptions->stopOnErrorFlag)
                        {
                            restoreInfo.error = ERROR_FILE_EXITS;
                        }
                        continue;
                    }

                    printInfo(2,"  Restore link '%s'...",String_cString(destinationFileName));

                    error = File_makeLink(destinationFileName,fileName);
                    if (error != ERROR_NONE)
                    {
                        printInfo(2,"FAIL!\n");
                        printError("Cannot create link '%s' -> '%s' (error: %s)\n",
                                   String_cString(destinationFileName),
                                   String_cString(fileName),
                                   Errors_getText(error)
                                  );
                        String_delete(destinationFileName);
                        Archive_closeEntry(&archiveFileInfo);
                        String_delete(fileName);
                        String_delete(linkName);
                        if (jobOptions->stopOnErrorFlag)
                        {
                            restoreInfo.error = error;
                        }
                        continue;
                    }

                    /* set file time, file owner/group */
                    if (jobOptions->owner.userId  != FILE_DEFAULT_USER_ID ) fileInfo.userId  = jobOptions->owner.userId;
                    if (jobOptions->owner.groupId != FILE_DEFAULT_GROUP_ID) fileInfo.groupId = jobOptions->owner.groupId;
                    error = File_setFileInfo(destinationFileName,&fileInfo);
                    if (error != ERROR_NONE)
                    {
                        if (jobOptions->stopOnErrorFlag)
                        {
                            printInfo(2,"FAIL!\n");
                            printError("Cannot set file info of '%s' (error: %s)\n",
                                       String_cString(destinationFileName),
                                       Errors_getText(error)
                                      );
                            String_delete(destinationFileName);
                            Archive_closeEntry(&archiveFileInfo);
                            String_delete(fileName);
                            String_delete(linkName);
                            if (jobOptions->stopOnErrorFlag)
                            {
                                restoreInfo.error = error;
                            }
                            continue;
                        }
                        else
                        {
                            printWarning("Cannot set file info of '%s' (error: %s)\n",
                                         String_cString(destinationFileName),
                                         Errors_getText(error)
                                        );
                        }
                    }

                    /* free resources */
                    String_delete(destinationFileName);

                    printInfo(2,"ok\n");
                }
                else
                {
                    /* skip */
                    printInfo(3,"  Restore '%s'...skipped\n",String_cString(linkName));
                }

                /* close archive file */
                Archive_closeEntry(&archiveFileInfo);
                String_delete(fileName);
                String_delete(linkName);
            }
            break;
            case FILE_TYPE_SPECIAL:
            {
                String   fileName;
                FileInfo fileInfo;
                String   destinationFileName;
//            FileInfo localFileInfo;

                /* read special device */
                fileName = String_new();
                error = Archive_readSpecialEntry(&archiveInfo,
                                                 &archiveFileInfo,
                                                 NULL,
                                                 NULL,
                                                 fileName,
                                                 &fileInfo
                                                );
                if (error != ERROR_NONE)
                {
                    printError("Cannot not read 'special' content of archive '%s' (error: %s)!\n",
                               String_cString(archiveFileName),
                               Errors_getText(error)
                              );
                    String_delete(fileName);
                    if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error;
                    break;
                }

                if (   (List_empty(includePatternList) || PatternList_match(includePatternList,fileName,PATTERN_MATCH_MODE_EXACT))
                        && !PatternList_match(excludePatternList,fileName,PATTERN_MATCH_MODE_EXACT)
                   )
                {
                    String_set(restoreInfo.statusInfo.fileName,fileName);
                    restoreInfo.statusInfo.fileDoneBytes = 0LL;
                    restoreInfo.statusInfo.fileTotalBytes = 00L;
                    updateStatusInfo(&restoreInfo);

                    /* get destination filename */
                    destinationFileName = getDestinationFileName(String_new(),
                                          fileName,
                                          jobOptions->directory,
                                          jobOptions->directoryStripCount
                                                                );


                    /* create special device */
                    if (!jobOptions->overwriteFilesFlag && File_exists(destinationFileName))
                    {
                        printInfo(1,
                                  "  Restore special device '%s'...skipped (file exists)\n",
                                  String_cString(destinationFileName)
                                 );
                        String_delete(destinationFileName);
                        Archive_closeEntry(&archiveFileInfo);
                        String_delete(fileName);
                        if (jobOptions->stopOnErrorFlag)
                        {
                            restoreInfo.error = ERROR_FILE_EXITS;
                        }
                        continue;
                    }

                    printInfo(2,"  Restore special device '%s'...",String_cString(destinationFileName));

                    error = File_makeSpecial(destinationFileName,
                                             fileInfo.specialType,
                                             fileInfo.major,
                                             fileInfo.minor
                                            );
                    if (error != ERROR_NONE)
                    {
                        printInfo(2,"FAIL!\n");
                        printError("Cannot create special device '%s' (error: %s)\n",
                                   String_cString(fileName),
                                   Errors_getText(error)
                                  );
                        String_delete(destinationFileName);
                        Archive_closeEntry(&archiveFileInfo);
                        String_delete(fileName);
                        if (jobOptions->stopOnErrorFlag)
                        {
                            restoreInfo.error = error;
                        }
                        continue;
                    }

                    /* set file time, file owner/group */
                    if (jobOptions->owner.userId  != FILE_DEFAULT_USER_ID ) fileInfo.userId  = jobOptions->owner.userId;
                    if (jobOptions->owner.groupId != FILE_DEFAULT_GROUP_ID) fileInfo.groupId = jobOptions->owner.groupId;
                    error = File_setFileInfo(destinationFileName,&fileInfo);
                    if (error != ERROR_NONE)
                    {
                        if (jobOptions->stopOnErrorFlag)
                        {
                            printInfo(2,"FAIL!\n");
                            printError("Cannot set file info of '%s' (error: %s)\n",
                                       String_cString(destinationFileName),
                                       Errors_getText(error)
                                      );
                            String_delete(destinationFileName);
                            Archive_closeEntry(&archiveFileInfo);
                            String_delete(fileName);
                            if (jobOptions->stopOnErrorFlag)
                            {
                                restoreInfo.error = error;
                            }
                            continue;
                        }
                        else
                        {
                            printWarning("Cannot set file info of '%s' (error: %s)\n",
                                         String_cString(destinationFileName),
                                         Errors_getText(error)
                                        );
                        }
                    }

                    /* free resources */
                    String_delete(destinationFileName);

                    printInfo(2,"ok\n");
                }
                else
                {
                    /* skip */
                    printInfo(3,"  Restore '%s'...skipped\n",String_cString(fileName));
                }

                /* close archive file */
                Archive_closeEntry(&archiveFileInfo);
                String_delete(fileName);
            }
            break;
            default:
#ifndef NDEBUG
                HALT_INTERNAL_ERROR_UNHANDLED_SWITCH_CASE();
#endif /* NDEBUG */
                break; /* not reached */
            }
        }

        /* close archive */
        Archive_close(&archiveInfo);
    }

    /* check fragment lists */
    if ((restoreInfo.requestedAbortFlag == NULL) || !(*restoreInfo.requestedAbortFlag))
    {
        for (fileFragmentNode = fileFragmentList.head; fileFragmentNode != NULL; fileFragmentNode = fileFragmentNode->next)
        {
            if (!FileFragmentList_checkComplete(fileFragmentNode))
            {
                printInfo(0,"Warning: incomplete file '%s'\n",String_cString(fileFragmentNode->fileName));
                if (restoreInfo.error == ERROR_NONE) restoreInfo.error = ERROR_FILE_INCOMPLETE;
            }
        }
    }

    /* free resources */
    String_delete(archiveFileName);
    FileFragmentList_done(&fileFragmentList);
    free(buffer);
    String_delete(restoreInfo.statusInfo.fileName);
    String_delete(restoreInfo.statusInfo.storageName);

    if ((restoreInfo.requestedAbortFlag == NULL) || !(*restoreInfo.requestedAbortFlag))
    {
        return restoreInfo.error;
    }
    else
    {
        return ERROR_ABORTED;
    }
}