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