* patchd symbol value [ file ]
* Like a db ! but works separate i/d.
long geto(), getsym(), itol();
if (argc
!= 3 && argc
!= 4) {
write(2, "Usage: patchd symbol value [ file ]\n", 36);
file
= argc
== 4 ? argv
[3] : "a.out";
if (read(0, &header
, sizeof header
) != sizeof header
)
if (header
.magic
< 0407 || header
.magic
> 0411) {
perror(file
, "Not object file");
addr
= iaddr
= getsym(argv
[1]) + 16;
case 0407: /* Non-shared */
/* Just skip past header */
/* Round to 4kW boundary */
addr
-= ((header
.txt_size
+ 8191) &~ 8191) - header
.txt_size
;
case 0411: /* Separate i/d */
Perror(file
, "Seek failed");
if (read(0, &word
, 2) != 2)
if (write(0, &value
, 2) != 2)
printf("Was %o now %o\n", word
, value
);
for (i
= 0; *cp
>= '0' && *cp
<= '7'; i
= (i
<< 3) | *cp
++ - '0')
write(2, "Bad number.\n", 12);
extern char *sys_errlist
[];
seek(0, sizeof header
, 0);
lseek(0, 0, header
.txt_size
, 1);
lseek(0, 0, header
.data_size
, 1);
for (i
= 0, j
= 0; i
< 8; i
++) {
n
= ldiv(0, header
.sym_size
, 12);
Perror(file
, "No name list");
if (read(0, nlp
, n
* 12) != n
* 12) {
Perror(file
, "Error reading");
for (i
= 0; i
< n
; i
++) {
if (nlp
->name
[j
] != symbol
[j
])
Perror(cp
, "Symbol not found");
if (!(nlp
->typ
&040) || j
!= 3) {
Perror(cp
, "Inappropriate symbol");
return (itol(0, nlp
->val
));