forked from dr-m/cbmconvert
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutil.c
80 lines (72 loc) · 2.21 KB
/
util.c
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
/**
* @file util.c
* Utility functions
* @author Marko Mäkelä (marko.makela at iki.fi)
*/
/*
** Copyright © 1993-1997,2001,2021 Marko Mäkelä
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <stdio.h>
#include <string.h>
#include "util.h"
/** Convert a file name to a printable null-terminated string.
* @param name the PETSCII file name to be converted
* @return the corresponding ASCII file name
*/
const char*
getFilename (const struct Filename* name)
{
static char buf[sizeof(name->name) + 5];
int i;
if (!name)
return 0;
/* remove trailing shifted spaces */
for (i = sizeof(name->name); i-- && name->name[i] == 0xA0; );
buf [++i] = 0;
while (i--)
if (name->name[i] >= 0x41 && name->name[i] <= 0x5A)
buf[i] = (char) (name->name[i] - 0x41 + 'a');
else if (name->name[i] >= 0xC1 && name->name[i] <= 0xDA)
buf[i] = (char) (name->name[i] - 0xC1 + 'A');
else if (name->name[i] >= 0x61 && name->name[i] <= 0x7A)
buf[i] = (char) (name->name[i] - 0x61 + 'A');
else if (name->name[i] >= 0x20 && name->name[i] <= 0x5F)
buf[i] = (char) name->name[i];
else
buf[i] = '_'; /* non-ASCII character */
switch (name->type) {
case DEL:
strcat (buf, ",del");
break;
case SEQ:
strcat (buf, ",seq");
break;
case PRG:
strcat (buf, ",prg");
break;
case USR:
strcat (buf, ",usr");
break;
case REL:
sprintf (buf + strlen(buf), ",l%02X", name->recordLength);
break;
case CBM:
strcat (buf, ",cbm");
break;
}
return buf;
}