]> wimlib.net Git - wimlib/blobdiff - src/lookup_table.c
Encodings update (IN PROGRESS)
[wimlib] / src / lookup_table.c
index 077fff970ddede5dddc316acaf7356f2dfa7721b..d1e5061232f06747b8e70238224cf8fdd99f011c 100644 (file)
@@ -6,7 +6,7 @@
  */
 
 /*
- * Copyright (C) 2012 Eric Biggers
+ * Copyright (C) 2012, 2013 Eric Biggers
  *
  * This file is part of wimlib, a library for working with WIM files.
  *
@@ -84,11 +84,12 @@ clone_lookup_table_entry(const struct wim_lookup_table_entry *old)
        memcpy(new, old, sizeof(*old));
        new->extracted_file = NULL;
        switch (new->resource_location) {
+       case RESOURCE_WIN32:
        case RESOURCE_IN_STAGING_FILE:
        case RESOURCE_IN_FILE_ON_DISK:
                BUILD_BUG_ON((void*)&old->file_on_disk !=
                             (void*)&old->staging_file_name);
-               new->staging_file_name = STRDUP(old->staging_file_name);
+               new->staging_file_name = TSTRDUP(old->staging_file_name);
                if (!new->staging_file_name)
                        goto out_free;
                break;
@@ -107,18 +108,18 @@ clone_lookup_table_entry(const struct wim_lookup_table_entry *old)
                        if (!loc)
                                goto out_free;
                        memcpy(loc, old->ntfs_loc, sizeof(*loc));
-                       loc->path_utf8 = NULL;
-                       loc->stream_name_utf16 = NULL;
+                       loc->path = NULL;
+                       loc->stream_name = NULL;
                        new->ntfs_loc = loc;
-                       loc->path_utf8 = STRDUP(old->ntfs_loc->path_utf8);
-                       if (!loc->path_utf8)
+                       loc->path = STRDUP(old->ntfs_loc->path);
+                       if (!loc->path)
                                goto out_free;
-                       loc->stream_name_utf16 = MALLOC(loc->stream_name_utf16_num_chars * 2);
-                       if (!loc->stream_name_utf16)
+                       loc->stream_name = MALLOC((loc->stream_name_nchars + 1) * 2);
+                       if (!loc->stream_name)
                                goto out_free;
-                       memcpy(loc->stream_name_utf16,
-                              old->ntfs_loc->stream_name_utf16,
-                              loc->stream_name_utf16_num_chars * 2);
+                       memcpy(loc->stream_name,
+                              old->ntfs_loc->stream_name,
+                              (loc->stream_name_nchars + 1) * 2);
                }
                break;
 #endif
@@ -138,6 +139,9 @@ void free_lookup_table_entry(struct wim_lookup_table_entry *lte)
                case RESOURCE_IN_STAGING_FILE:
                case RESOURCE_IN_ATTACHED_BUFFER:
                case RESOURCE_IN_FILE_ON_DISK:
+#ifdef __WIN32__
+               case RESOURCE_WIN32:
+#endif
                        BUILD_BUG_ON((void*)&lte->file_on_disk !=
                                     (void*)&lte->staging_file_name);
                        BUILD_BUG_ON((void*)&lte->file_on_disk !=
@@ -147,8 +151,8 @@ void free_lookup_table_entry(struct wim_lookup_table_entry *lte)
 #ifdef WITH_NTFS_3G
                case RESOURCE_IN_NTFS_VOLUME:
                        if (lte->ntfs_loc) {
-                               FREE(lte->ntfs_loc->path_utf8);
-                               FREE(lte->ntfs_loc->stream_name_utf16);
+                               FREE(lte->ntfs_loc->path);
+                               FREE(lte->ntfs_loc->stream_name);
                                FREE(lte->ntfs_loc);
                        }
                        break;
@@ -186,7 +190,7 @@ void free_lookup_table(struct wim_lookup_table *table)
  * Inserts an entry into the lookup table.
  *
  * @table:     A pointer to the lookup table.
- * @entry:     A pointer to the entry to insert.
+ * @lte:       A pointer to the entry to insert.
  */
 void lookup_table_insert(struct wim_lookup_table *table,
                         struct wim_lookup_table_entry *lte)
@@ -344,12 +348,14 @@ int read_lookup_table(WIMStruct *w)
                    && !((duplicate_entry->resource_entry.flags & WIM_RESHDR_FLAG_METADATA)
                          && cur_entry->resource_entry.flags & WIM_RESHDR_FLAG_METADATA))
                {
+               #ifdef ENABLE_ERROR_MESSAGES
                        ERROR("The WIM lookup table contains two entries with the "
                              "same SHA1 message digest!");
                        ERROR("The first entry is:");
-                       print_lookup_table_entry(duplicate_entry);
+                       print_lookup_table_entry(duplicate_entry, stderr);
                        ERROR("The second entry is:");
-                       print_lookup_table_entry(cur_entry);
+                       print_lookup_table_entry(cur_entry, stderr);
+               #endif
                        ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY;
                        goto out_free_cur_entry;
                }
@@ -358,18 +364,22 @@ int read_lookup_table(WIMStruct *w)
                    && (cur_entry->resource_entry.size !=
                        cur_entry->resource_entry.original_size))
                {
+               #ifdef ENABLE_ERROR_MESSAGES
                        ERROR("Found uncompressed resource with original size "
                              "not the same as compressed size");
                        ERROR("The lookup table entry for the resource is as follows:");
-                       print_lookup_table_entry(cur_entry);
+                       print_lookup_table_entry(cur_entry, stderr);
+               #endif
                        ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY;
                        goto out_free_cur_entry;
                }
                if ((cur_entry->resource_entry.flags & WIM_RESHDR_FLAG_METADATA)
                    && cur_entry->refcnt != 1)
                {
+               #ifdef ENABLE_ERROR_MESSAGES
                        ERROR("Found metadata resource with refcnt != 1:");
-                       print_lookup_table_entry(cur_entry);
+                       print_lookup_table_entry(cur_entry, stderr);
+               #endif
                        ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY;
                        goto out_free_cur_entry;
                }
@@ -469,57 +479,65 @@ int lte_free_extracted_file(struct wim_lookup_table_entry *lte, void *ignore)
        return 0;
 }
 
-void print_lookup_table_entry(const struct wim_lookup_table_entry *lte)
+void print_lookup_table_entry(const struct wim_lookup_table_entry *lte,
+                             FILE *out)
 {
        if (!lte) {
-               putchar('\n');
+               tputc(T('\n'), out);
                return;
        }
-       printf("Offset            = %"PRIu64" bytes\n",
-              lte->resource_entry.offset);
-       printf("Size              = %"PRIu64" bytes\n",
-              (u64)lte->resource_entry.size);
-       printf("Original size     = %"PRIu64" bytes\n",
-              lte->resource_entry.original_size);
-       printf("Part Number       = %hu\n", lte->part_number);
-       printf("Reference Count   = %u\n", lte->refcnt);
-       printf("Hash              = 0x");
+       tfprintf(out, T("Offset            = %"PRIu64" bytes\n"),
+                lte->resource_entry.offset);
+
+       tfprintf(out, T("Size              = %"PRIu64" bytes\n"),
+                (u64)lte->resource_entry.size);
+
+       tfprintf(out, T("Original size     = %"PRIu64" bytes\n"),
+                lte->resource_entry.original_size);
+
+       tfprintf(out, T("Part Number       = %hu\n"), lte->part_number);
+       tfprintf(out, T("Reference Count   = %u\n"), lte->refcnt);
+
+       tfprintf(out, T("Hash              = 0x"));
        print_hash(lte->hash);
-       putchar('\n');
-       printf("Flags             = ");
+       tputc(T('\n'), out);
+
+       tfprintf(out, T("Flags             = "));
        u8 flags = lte->resource_entry.flags;
        if (flags & WIM_RESHDR_FLAG_COMPRESSED)
-               fputs("WIM_RESHDR_FLAG_COMPRESSED, ", stdout);
+               tfputs(T("WIM_RESHDR_FLAG_COMPRESSED, "), out);
        if (flags & WIM_RESHDR_FLAG_FREE)
-               fputs("WIM_RESHDR_FLAG_FREE, ", stdout);
+               tfputs(T("WIM_RESHDR_FLAG_FREE, "), out);
        if (flags & WIM_RESHDR_FLAG_METADATA)
-               fputs("WIM_RESHDR_FLAG_METADATA, ", stdout);
+               tfputs(T("WIM_RESHDR_FLAG_METADATA, "), out);
        if (flags & WIM_RESHDR_FLAG_SPANNED)
-               fputs("WIM_RESHDR_FLAG_SPANNED, ", stdout);
-       putchar('\n');
+               tfputs(T("WIM_RESHDR_FLAG_SPANNED, "), out);
+       tputc(T('\n'), out);
        switch (lte->resource_location) {
        case RESOURCE_IN_WIM:
                if (lte->wim->filename) {
-                       printf("WIM file          = `%s'\n",
-                              lte->wim->filename);
+                       tfprintf(out, T("WIM file          = `%"TS"'\n"),
+                                lte->wim->filename);
                }
                break;
        case RESOURCE_IN_FILE_ON_DISK:
-               printf("File on Disk      = `%s'\n", lte->file_on_disk);
+               tfprintf(out, T("File on Disk      = `%"TS"'\n"),
+                        lte->file_on_disk);
                break;
        case RESOURCE_IN_STAGING_FILE:
-               printf("Staging File      = `%s'\n", lte->staging_file_name);
+               tfprintf(out, T("Staging File      = `%"TS"'\n"),
+                               lte->staging_file_name);
                break;
        default:
                break;
        }
-       putchar('\n');
+       tputc(T('\n'), out);
 }
 
 static int do_print_lookup_table_entry(struct wim_lookup_table_entry *lte,
-                                      void *ignore)
+                                      void *fp)
 {
-       print_lookup_table_entry(lte);
+       print_lookup_table_entry(lte, (FILE*)fp);
        return 0;
 }
 
@@ -530,7 +548,7 @@ WIMLIBAPI void wimlib_print_lookup_table(WIMStruct *w)
 {
        for_lookup_table_entry(w->lookup_table,
                               do_print_lookup_table_entry,
-                              NULL);
+                              stdout);
 }
 
 /* Given a SHA1 message digest, return the corresponding entry in the WIM's
@@ -559,32 +577,34 @@ __lookup_resource(const struct wim_lookup_table *table, const u8 hash[])
  *
  * This is only for pre-resolved inodes.
  */
-int lookup_resource(WIMStruct *w, const char *path,
-                   int lookup_flags,
-                   struct wim_dentry **dentry_ret,
-                   struct wim_lookup_table_entry **lte_ret,
-                   u16 *stream_idx_ret)
+int
+lookup_resource(WIMStruct *w,
+               const tchar *path,
+               int lookup_flags,
+               struct wim_dentry **dentry_ret,
+               struct wim_lookup_table_entry **lte_ret,
+               u16 *stream_idx_ret)
 {
        struct wim_dentry *dentry;
        struct wim_lookup_table_entry *lte;
        u16 stream_idx;
-       const char *stream_name = NULL;
+       const tchar *stream_name = NULL;
        struct wim_inode *inode;
-       char *p = NULL;
+       tchar *p = NULL;
 
        if (lookup_flags & LOOKUP_FLAG_ADS_OK) {
                stream_name = path_stream_name(path);
                if (stream_name) {
-                       p = (char*)stream_name - 1;
-                       *p = '\0';
+                       p = (tchar*)stream_name - 1;
+                       *p = T('\0');
                }
        }
 
        dentry = get_dentry(w, path);
        if (p)
-               *p = ':';
+               *p = T(':');
        if (!dentry)
-               return -ENOENT;
+               return -errno;
 
        inode = dentry->d_inode;