-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathCFget.c
More file actions
123 lines (110 loc) · 3.11 KB
/
CFget.c
File metadata and controls
123 lines (110 loc) · 3.11 KB
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
/*
* LSI-11 Linker
* þÔÅÎÉÅ ÕÐÒÁ×ÌÑÀÝÅÇÏ ÆÁÊÌÁ.
* éÍÅÎÁ ÍÏÄÕÌÅÊ ÚÁÄÁÀÔÓÑ × ÔÅËÓÔÒÏ×ÏÍ ÆÁÊÌÅ × Ó×ÏÂÏÄÎÏÍ ÆÏÒÍÁÔÅ,
* ÒÁÚÄÅÌÑÀÔÓÑ ÐÒÏÂÅÌÁÍÉ É ËÏÎÃÁÍÉ ÓÔÒÏË. ÷ ÉÍÅÎÁÈ ÐÒÏÂÅÌÏ× ÎÅÔ.
*/
#include <SysCalls> /* _exit_() */
#include <SysConv> /* conv() */
#include <FileSystem> /* GetFileItem() */
#define LFNAME (sizeof(Fname))
#include <SysIO> /* _inp1(), _stfi1() */
#include <StartOpers> /* StartLibr() */
#define LIBASK 0
#include "LinkerDefs" /* ðÒÏÔÏÔÉÐÙ */
#define LDA_DFL 02000 /*áÄÒÅÓ ÚÁÇÒÕÚËÉ ÐÏ ÕÍÏÌÞÁÎÉÀ*/
static int cback;
static int backflag;
#define GET1() ( (backflag)?(backflag=0,cback):(cback=_inp1()) )
#define UNGET() backflag++;
static int Lcnt;
/*
* îÁÞÁÌÏ ÞÔÅÎÉÑ. þÔÅÎÉÅ ÁÄÒÅÓÁ ÚÁÇÒÕÚËÉ
*/
char *CFopen()
{
static char CFname[ LFNAME+1 ];
/*
* ïÔËÒÙ×ÁÅÍ ÆÁÊÌ × óÉÓÔÅÍÅ
*/
{
FileItem *ip;
int rc;
MVS( "S\0\0\1\tLSI-11 Linker control file", 31, AZC );
if( (rc = StartLibr( LIBASK, 0 )) < 1 ) _exit_( rc );
_stfi1( rc = ((int)AZC[ 1 ] & 0xFF) );
ip = GetFileItem( (char) rc );
MVS( ip->name.c, LFNAME, CFname );
CFname[ LFNAME ] = 0;
}
/*
* þÉÔÁÅÍ ÇÌÏÂÁÌØÎÕÀ ÉÎÆÏÒÍÁÃÉÀ
*/
{
unsigned int Laddr;
int radix;
int c;
backflag = 0;
Lcnt = 1;
Laddr = LDA_DFL;
radix = 8;
if( (c = GET1()) == '=' ){ /* áÄÒÅÓ ÚÁÇÒÕÚËÉ */
Laddr = 0;
for(;;){
c = GET1();
if( c == '\n' ){ Lcnt++; GET1(); break; }
if( (c & 0x60) == 0x60 ) c -= 0x20;
Laddr *= radix;
if( c >= '0' && c <= '7' ){
Laddr += (c - '0');
}else if( c >= '8' && c <= '9' ){
if( radix < 10 ) goto BadAddr;
Laddr += (c - '0');
}else if( c >='A' && c <='F' ){
if( radix < 16 ) goto BadAddr;
Laddr += (c - 'A'+10);
}else if( c == '&' ){
radix = 16;
}else{
goto BadAddr;
}
}
}
UNGET();
Tseta( Laddr ); /* úÁÄÁÅÍ ÁÄÒÅÓ ÚÁÇÕÚËÉ */
return CFname;
BadAddr:
Diagnose( 4, _conv( Lcnt, 2, 10 ) );
while( c != '\n' && c >= 0 ) c = GET1();
UNGET();
Tseta( LDA_DFL );
return CFname;
}
}
char *CFget() /* ÷ÏÚ×ÒÁÝÁÅÔ ÕËÁÚÁÔÅÌØ ÎÁ ÉÍÑ Ó ÎÕÌØËÏÍ
* ÉÌÉ NULL, ÅÓÌÉ ËÏÎÅÃ ÆÁÊÌÁ */
{
static char modname[ LFNAME+1 ];
int c;
int len;
while( (c = GET1()) == ' ' || c == '\n' ){
if( c == '\n' ) Lcnt++;
if( c <= 0 ){
UNGET();
return NULL;
}
}
UNGET();
for( len = 0; len < LFNAME; len++ ){
c = GET1();
if( c == '\n' ) Lcnt++;
if( c <= 0 ){
UNGET();
return NULL;
}
if( c == ' ' || c == '\n' ) break;
modname[ len ] = (char) c;
}
modname[ len ] = '\0';
return modname;
}