1 | /* omflibwr.c (emx+gcc) -- Copyright (c) 1993-1996 by Eberhard Mattes */
|
---|
2 |
|
---|
3 | /* Write an OMFLIB. */
|
---|
4 |
|
---|
5 | #include <stdio.h>
|
---|
6 | #include <stdlib.h>
|
---|
7 | #include <string.h>
|
---|
8 | #include "omflib0.h"
|
---|
9 | #include <sys/omflib.h>
|
---|
10 |
|
---|
11 |
|
---|
12 | int omflib_write_record (struct omflib *p, byte rec_type, word rec_len,
|
---|
13 | const byte *buffer, int chksum, char *error)
|
---|
14 | {
|
---|
15 | struct omf_rec rec;
|
---|
16 | byte sum;
|
---|
17 | int i, len;
|
---|
18 | char name[256];
|
---|
19 |
|
---|
20 | rec.rec_type = rec_type;
|
---|
21 | rec.rec_len = (chksum ? rec_len + 1 : rec_len);
|
---|
22 | if (fwrite (&rec, sizeof (rec), 1, p->f) != 1
|
---|
23 | || fwrite (buffer, rec_len, 1, p->f) != 1)
|
---|
24 | return omflib_set_error (error);
|
---|
25 | if (chksum)
|
---|
26 | {
|
---|
27 | sum = rec_type + (rec.rec_len & 0xff) + (rec.rec_len >> 8);
|
---|
28 | for (i = 0; i < rec_len; ++i)
|
---|
29 | sum += buffer[i];
|
---|
30 | sum = (byte)(256 - sum);
|
---|
31 | if (fputc (sum, p->f) == EOF)
|
---|
32 | return omflib_set_error (error);
|
---|
33 | }
|
---|
34 | switch (rec_type)
|
---|
35 | {
|
---|
36 | case MODEND:
|
---|
37 | case MODEND|REC32:
|
---|
38 | if (omflib_pad (p->f, p->page_size, FALSE, error) != 0)
|
---|
39 | return -1;
|
---|
40 | if (p->state != OS_SIMPLE)
|
---|
41 | {
|
---|
42 | len = strlen (p->mod_name);
|
---|
43 | if (len < 255)
|
---|
44 | {
|
---|
45 | memcpy (name, p->mod_name, len);
|
---|
46 | name[len] = '!';
|
---|
47 | name[len+1] = 0;
|
---|
48 | if (omflib_add_pub (p, name, p->mod_page, error) != 0)
|
---|
49 | return -1;
|
---|
50 | }
|
---|
51 | }
|
---|
52 | break;
|
---|
53 |
|
---|
54 | case THEADR:
|
---|
55 | p->state = OS_EMPTY;
|
---|
56 | break;
|
---|
57 |
|
---|
58 | case ALIAS:
|
---|
59 | p->state = (p->state == OS_EMPTY ? OS_SIMPLE : OS_OTHER);
|
---|
60 | break;
|
---|
61 |
|
---|
62 | case COMENT:
|
---|
63 | if (p->state == OS_EMPTY && rec_len >= 3
|
---|
64 | && buffer[1] == IMPDEF_CLASS && buffer[2] == IMPDEF_SUBTYPE)
|
---|
65 | p->state = OS_SIMPLE;
|
---|
66 | else
|
---|
67 | p->state = OS_OTHER;
|
---|
68 | break;
|
---|
69 |
|
---|
70 | default:
|
---|
71 | p->state = OS_OTHER;
|
---|
72 | break;
|
---|
73 | }
|
---|
74 | return 0;
|
---|
75 | }
|
---|
76 |
|
---|
77 |
|
---|
78 | int omflib_write_module (struct omflib *p, const char *name, word *pagep,
|
---|
79 | char *error)
|
---|
80 | {
|
---|
81 | byte buf[256];
|
---|
82 | long long_page;
|
---|
83 | int len;
|
---|
84 |
|
---|
85 | p->state = OS_EMPTY;
|
---|
86 | if (omflib_module_name (p->mod_name, name) != 0)
|
---|
87 | {
|
---|
88 | strcpy (error, "Module name too long");
|
---|
89 | return -1;
|
---|
90 | }
|
---|
91 | long_page = ftell (p->f) / p->page_size;
|
---|
92 | if (long_page > 65535)
|
---|
93 | {
|
---|
94 | strcpy (error, "Library too big -- increase page size");
|
---|
95 | return -1;
|
---|
96 | }
|
---|
97 | *pagep = p->mod_page = (word)long_page;
|
---|
98 | len = strlen (name);
|
---|
99 | memcpy (buf+1, name, len);
|
---|
100 | buf[0] = (byte)len;
|
---|
101 | return omflib_write_record (p, THEADR, len + 1, buf, TRUE, error);
|
---|
102 | }
|
---|