1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
//! Path utilities for MPQ archives
//!
//! MPQ archives use backslashes (`\`) as path separators internally, regardless
//! of the host operating system. This module provides utilities to normalize
//! paths for storage and convert them for extraction.
//!
//! # Path Separator Handling
//!
//! When working with MPQ archives:
//! - **Adding files**: Paths are automatically normalized to use backslashes
//! - **Reading files**: Both forward slashes and backslashes are accepted
//! - **Listing files**: Paths are displayed using the system's native separator
//! - **Extracting files**: Output paths use the system's native separator
//!
//! # Examples
//!
//! ```no_run
//! use wow_mpq::ArchiveBuilder;
//!
//! // These all refer to the same file internally
//! let builder = ArchiveBuilder::new()
//! .add_file("data.txt", "dir/subdir/file.txt") // Forward slashes
//! .add_file("data.txt", "dir\\subdir\\file.txt") // Backslashes
//! .add_file("data.txt", "dir/subdir\\file.txt"); // Mixed
//!
//! // When reading, both separators work
//! # use wow_mpq::Archive;
//! # let mut archive = Archive::open("test.mpq").unwrap();
//! let data1 = archive.read_file("dir/subdir/file.txt").unwrap();
//! let data2 = archive.read_file("dir\\subdir\\file.txt").unwrap();
//! assert_eq!(data1, data2);
//! ```
/// Normalize a file path to MPQ archive format
///
/// MPQ archives use backslashes (`\`) as path separators internally, regardless
/// of the host operating system. This function converts forward slashes to backslashes.
///
/// **Note**: This function only normalizes path separators. Case normalization
/// (uppercasing) is handled separately at the `PatchChain` level to enable
/// case-insensitive file lookups.
///
/// # Arguments
///
/// * `path` - The path to normalize
///
/// # Returns
///
/// A string with all forward slashes replaced with backslashes
///
/// # Examples
///
/// ```
/// use wow_mpq::path::normalize_mpq_path;
///
/// assert_eq!(normalize_mpq_path("dir/file.txt"), "dir\\file.txt");
/// assert_eq!(normalize_mpq_path("dir\\file.txt"), "dir\\file.txt");
/// assert_eq!(normalize_mpq_path("a/b/c/file.txt"), "a\\b\\c\\file.txt");
/// ```
/// Convert an MPQ path to a system path
///
/// On Windows, this is a no-op since Windows uses backslashes.
/// On Unix-like systems, this converts backslashes to forward slashes.
///
/// # Examples
///
/// ```
/// use wow_mpq::path::mpq_path_to_system;
///
/// #[cfg(unix)]
/// assert_eq!(mpq_path_to_system("dir\\file.txt"), "dir/file.txt");
///
/// #[cfg(windows)]
/// assert_eq!(mpq_path_to_system("dir\\file.txt"), "dir\\file.txt");
/// ```