-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathutils.cpp
89 lines (76 loc) · 1.89 KB
/
utils.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
#include "piler2.h"
char *strsave(const char *s)
{
if (0 == s)
return 0;
char *ptrCopy = strdup(s);
if (0 == ptrCopy)
Quit("Out of memory");
return ptrCopy;
}
static const char *StdioStrMode(FILEIO_MODE Mode)
{
switch (Mode)
{
case FILEIO_MODE_ReadOnly:
return FILIO_STRMODE_ReadOnly;
case FILEIO_MODE_WriteOnly:
return FILIO_STRMODE_WriteOnly;
case FILEIO_MODE_ReadWrite:
return FILIO_STRMODE_ReadWrite;
}
Quit("StdioStrMode: Invalid mode");
return "r";
}
FILE *OpenStdioFile(const char *FileName, FILEIO_MODE Mode)
{
const char *strMode = StdioStrMode(Mode);
FILE *f = fopen(FileName, strMode);
if (0 == f)
Quit("Cannot open %s, %s [%d]", FileName, strerror(errno), errno);
return f;
}
void Rewind(FILE *f)
{
int Ok = fseek(f, 0, SEEK_SET);
if (Ok != 0)
Quit("Rewind fseek() != 0 errno=%d", errno);
long CurrPos = ftell(f);
if (CurrPos != 0)
Quit("FileSize: ftell=%ld errno=%d", CurrPos, errno);
}
int GetFileSize(FILE *f)
{
long CurrPos = ftell(f);
if (CurrPos < 0)
Quit("FileSize: ftell<0 (CurrPos), errno=%d", errno);
int Ok = fseek(f, 0, SEEK_END);
if (Ok != 0)
Quit("FileSize fseek(END) != 0 errno=%d", errno);
long Size = ftell(f);
if (Size < 0)
Quit("FileSize: ftell<0 (size), errno=%d", errno);
Ok = fseek(f, CurrPos, SEEK_SET);
if (Ok != 0)
Quit("FileSize fseek(restore curr pos) != 0 errno=%d", errno);
long NewPos = ftell(f);
if (CurrPos < 0)
Quit("FileSize: ftell=%ld != CurrPos=%ld", CurrPos, NewPos);
return (int) Size;
}
int Overlap(int From1, int To1, int From2, int To2)
{
return min(To1, To2) - max(From1, From2);
}
// Add minimum possible value of j to i such that:
// (a) j >= MinInc, and
// (b) (i + j)%MultipleOf = 0.
int RoundUp(int i, int MinInc, int MultipleOf)
{
int newi = i + MinInc;
int k = newi%MultipleOf;
if (k > 0)
newi += (MultipleOf - k);
assert(newi >= i + MinInc && 0 == newi%MultipleOf);
return newi;
}