| 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 | }
|
|---|