167
167
uint32_t size /* file size */
170
def mangle_fname(name):
170
LFN_ENTRY = """little:
181
# Global variable to hold the file names in 8.3 format. Needed to
182
# keep track of "number" when creating a short fname from a LFN.
186
"Create a 8.3 name for the given fname"
171
188
# FIXME: filter illegal characters
172
parts = name.split('.')
189
parts = fname.split('.')
174
198
if len(parts) > 0:
180
sys.stdout.write("mkfat.py: error: Directory entry " + name +
181
" base name is longer than 8 characters\n")
184
return (fname + ' ').upper()[0:8]
186
def mangle_ext(name):
187
# FIXME: filter illegal characters
188
parts = name.split('.')
196
sys.stdout.write("mkfat.py: error: Directory entry " + name +
197
" has more than one extension\n")
201
sys.stdout.write("mkfat.py: error: Directory entry " + name +
202
" extension is longer than 3 characters\n")
205
return (ext + ' ').upper()[0:3]
212
return (name.ljust(8)[0:8], ext.ljust(3)[0:3], False)
214
# For filenames with multiple extensions, we treat the last one
215
# as the actual extension. The rest of the filename is stripped
216
# of dots and concatenated to form the short name
217
for _name in parts[1:-1]:
221
for number in range(1, 10000) :
222
number_str = '~' + str(number)
224
if len(name) + len(number_str) > 8 :
225
name = name[0:8 - len(number_str)]
227
name = name + number_str;
229
if (name + ext) not in name83_list :
232
name83_list.append(name + ext)
234
return (name.ljust(8)[0:8], ext.ljust(3)[0:3], True)
236
def get_utf16(name, l) :
237
"Create a int array out of a string which we can store in uint16_t arrays"
239
bs = [0xFFFF for i in range(l)]
241
for i in range(len(name)) :
249
def create_lfn_entry((name, index)) :
250
entry = xstruct.create(LFN_ENTRY)
252
entry.name1 = get_utf16(name[0:5], 5)
253
entry.name2 = get_utf16(name[5:11], 6)
254
entry.name3 = get_utf16(name[11:13], 2)
207
263
def create_dirent(name, directory, cluster, size):
208
265
dir_entry = xstruct.create(DIR_ENTRY)
210
dir_entry.name = mangle_fname(name).encode('ascii')
211
dir_entry.ext = mangle_ext(name).encode('ascii')
267
dir_entry.name, dir_entry.ext, lfn = name83(name)
269
dir_entry.name = dir_entry.name.upper().encode('ascii')
270
dir_entry.ext = dir_entry.ext.upper().encode('ascii')
214
273
dir_entry.attr = 0x30
230
289
dir_entry.size = size
295
n = len(name) / 13 + 1
296
names = [(name[i * 13: (i + 1) * 13 + 1], i + 1) for i in range(n)]
298
entries = sorted(map (create_lfn_entry, names), reverse = True, key = lambda e : e.pos)
299
entries[0].pos |= 0x40
301
fname11 = dir_entry.name + dir_entry.ext
304
for i in range(0, 11) :
305
csum = ((csum & 1) << 7) + (csum >> 1) + ord(fname11[i])
311
entries.append(dir_entry)
234
315
def create_dot_dirent(empty_cluster):
235
316
dir_entry = xstruct.create(DOT_DIR_ENTRY)
287
368
for item in listdir_items(root):
289
370
rv = write_file(item, outf, cluster_size, data_start, fat, reserved_clusters)
290
directory.append(create_dirent(item.name, False, rv[0], rv[1]))
371
directory.extend(create_dirent(item.name, False, rv[0], rv[1]))
291
372
elif item.is_dir:
292
373
rv = recursion(False, item.path, outf, cluster_size, root_start, data_start, fat, reserved_clusters, dirent_size, empty_cluster)
293
directory.append(create_dirent(item.name, True, rv[0], rv[1]))
374
directory.extend(create_dirent(item.name, True, rv[0], rv[1]))
296
377
outf.seek(root_start)