-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path3ds.cpp
99 lines (72 loc) · 1.61 KB
/
3ds.cpp
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
/*
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
made by ALACN
alacn@bol.com.br
uhahaa@msn.com
http://www.strategyplanet.com/populous
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
*/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "3ds.h"
DWORD _3dsCalcChunkSize(CHUNK *root)
{
DWORD dwSize = sizeof(CHUNK_HDR);
if(root->data) dwSize += root->data_size;
CHUNK *chunk = root->Child;
if(chunk) do
{
dwSize += _3dsCalcChunkSize(chunk);
chunk = chunk->Next;
}
while(chunk != root->Child);
root->hdr.length = dwSize;
return dwSize;
}
void _3dsDestroyChunk(CHUNK *root)
{
if(root->data)
{
free(root->data);
root->data = 0;
}
while(root->Child)
{
CHUNK *child = root->Child;
UNLINK(root->Child, child);
_3dsDestroyChunk(child);
delete child;
}
}
bool _3dsWriteChunk(HANDLE h, CHUNK *root)
{
DWORD dwW;
dwW = 0;
WriteFile(h, &root->hdr, sizeof(CHUNK_HDR), &dwW, 0);
if(dwW != sizeof(CHUNK_HDR)) return false;
dwW = 0;
WriteFile(h, root->data, root->data_size, &dwW, 0);
if(dwW != root->data_size) return false;
CHUNK *chunk = root->Child;
if(chunk) do
{
if(!_3dsWriteChunk(h, chunk)) return false;
chunk = chunk->Next;
}
while(chunk != root->Child);
return true;
}
bool _3dsWriteFile(char *name, CHUNK *root)
{
HANDLE h = CreateFile(name, GENERIC_READ | GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if(h == INVALID_HANDLE_VALUE) return false;
_3dsCalcChunkSize(root);
if(!_3dsWriteChunk(h, root))
{
CloseHandle(h);
return false;
}
CloseHandle(h);
return true;
}