-
Notifications
You must be signed in to change notification settings - Fork 0
/
filename-smith.c
168 lines (159 loc) · 4.33 KB
/
filename-smith.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
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
typedef unsigned long long uint64;
typedef long long int64;
typedef unsigned long long u64;
typedef long long i64;
typedef unsigned char uchar;
#ifndef PDP10WORD
#define PDP10WORD
typedef union
{
uint64 fw;
struct { uint64 c6:6,c5:6,c4:6,c3:6,c2:6,c1:6, pad:28; } sixbit; // ASCII sixbit + 040
struct { int64 right:18, left:18, pad:28; } half; // half word left,,right
} pdp10_word;
#endif
#define MAXCNT 3020800
pdp10_word m[ 3020800 ];
/*
PDP-10 sixbit encoding: octal 00 space to octal 77 underbar
ASCII space atsign ASCII underbar
040 0100 0137
↓ ↓ ↓
" !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_"
special convert SIXBIT tables
_fname replaces double quote, comma, dot, back-slash, forward-slash with underbar.
_safe replaces the five punctuation
characters ▶ ",.\/ ◀ with ▶ {~}|| ◀ for easier CSV format and BASH shelling.
_ppn Project Programmer safe, assumes that any punctuation is a media error,
and so replaces all punctuation with underbar.
*/
char *sixbit_fname = " !_" "#$%&'()*+_-__0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ" "[_]^_";
char *sixbit_safe = " !{" "#$%&'()*+~-}|0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ" "[|]^_";
char *sixbit_ppn = " __" "_____________0123456789_______ABCDEFGHIJKLMNOPQRSTUVWXYZ" "_____";
/* ascii SIXBIT decoding functions
* -------------------------------------------------------------------- *
* sixbit word into ASCII string
* sixbit halfword into ASCII string
*/
char *
sixbit_u64_into_ascii( char *p0, u64 u, char *tbl )
{
char *p=p0;
pdp10_word w;
w.fw = u;
// decode SIXBIT into ASCII by arithmetic would simply be + 040
*p++ = tbl[w.sixbit.c1];
*p++ = tbl[w.sixbit.c2];
*p++ = tbl[w.sixbit.c3];
*p++ = tbl[w.sixbit.c4];
*p++ = tbl[w.sixbit.c5];
*p++ = tbl[w.sixbit.c6];
*p++ = 0;
return p0;
}
char *
sixbit_word_into_ascii( char *p0, pdp10_word w, char *tbl )
{
char *p=p0;
// decode SIXBIT into ASCII by arithmetic would simply be + 040
*p++ = tbl[w.sixbit.c1];
*p++ = tbl[w.sixbit.c2];
*p++ = tbl[w.sixbit.c3];
*p++ = tbl[w.sixbit.c4];
*p++ = tbl[w.sixbit.c5];
*p++ = tbl[w.sixbit.c6];
*p++ = 0;
return p0;
}
char *
sixbit_halfword_into_ascii( char *p0, int halfword, char *tbl )
{
char *p=p0;
*p++ = tbl[(halfword >> 12) & 077];
*p++ = tbl[(halfword >> 6) & 077];
*p++ = tbl[ halfword & 077];
*p++ = 0;
return p0;
}
void
omit_spaces(char *q)
{
char *t,*p;
for (p= t= q; *p; p++)
if (*p != ' ')
*t++ = *p;
*t++ = 0;
}
void
force_to_lowercase(char *p)
{
for (;*p;p++)
if ('A'<=*p && *p<='Z')
*p |= 040;
}
void
force_to_uppercase(char *p)
{
for (;*p;p++)
if ('a'<=*p && *p<='z')
*p &= ~040;
}
void
space_to_underbar(char *p)
{
for (;*p;p++)
if (*p==' ')
*p = '_';
}
void
leading_space_to_underbar(char *p)
{
for (;*p;p++)
if (*p==' ')
*p = '_';
else
break;
}
void
dartname_(char* flat, char* filnam, char* ext, char* prj, char* prg)
{
sprintf( flat, "%3.3s.%3.3s %-6.6s %-3.3s", prg, prj, filnam, ext );
if( flat[15] != ' ' ) flat[14]='.'; // dot when extension
}
void
dartname_u64(char* flat, u64 u_ppn, u64 u_fil, u64 u_ext)
{
char ppn[8],fil[8],ext[8];
sixbit_u64_into_ascii( ppn, u_ppn, sixbit_ppn );
sixbit_u64_into_ascii( fil, u_fil, sixbit_safe );
sixbit_u64_into_ascii( ext, u_ext, sixbit_safe );
if ( u_ppn == 000022000022LL ){ // space preservation for [2,2] mail box file names
space_to_underbar(fil);
}
sprintf( flat, "%3.3s.%3.3s %-6.6s %-3.3s", ppn+3, ppn, fil, ext );
if( flat[15] != ' ' ) flat[14]='.'; // dot when extension
}
void
unixname_(char* flat, char* filnam, char* ext, char* prj, char* prg)
{
if(!strcmp(prg," 2") && !strcmp(prj," 2")){
space_to_underbar(filnam);
}
omit_spaces(ext);
sprintf( flat, "%.3s.%.3s/%.6s%s%.3s",
prg, prj, filnam,
*ext ? "." : "",
ext );
omit_spaces(flat);
force_to_lowercase(flat);
}
void
touch_file_modtime(char *path,char *iso_dt){
struct tm tm;
struct utimbuf utm;
//
bzero(&tm,sizeof(tm));
strptime(iso_dt,"%F %R",&tm);
utm.actime = utm.modtime = mktime( &tm );
utime(path,&utm);
}