source: trunk/emx/src/libomflib/omflibwr.c

Last change on this file was 18, checked in by bird, 22 years ago

Initial revision

  • Property cvs2svn:cvs-rev set to 1.1
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 2.4 KB
Line 
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
12int 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
78int 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}
Note: See TracBrowser for help on using the repository browser.