|
|
1.1 root 1: /* tag: forth source loader
2: *
3: * Copyright (C) 2004 Stefan Reinauer
4: *
5: * See the file "COPYING" for further information about
6: * the copyright and warranty status of this work.
7: */
8:
9: #include "config.h"
10: #include "kernel/kernel.h"
11: #include "libopenbios/bindings.h"
12: #include "libopenbios/sys_info.h"
13: #include "libc/diskio.h"
14: #include "libopenbios/forth_load.h"
15: #define printk printk
16: #define debug printk
17:
18: static int fd;
19: static char *forthtext=NULL;
20:
21: int is_forth(char *forth)
22: {
23: return (forth[0] == '\\' && forth[1] == ' ');
24: }
25:
26: int forth_load(ihandle_t dev)
27: {
28: char magic[2];
29: unsigned long forthsize;
30: int retval = -1;
31:
32: /* Mark the saved-program-state as invalid */
33: feval("0 state-valid !");
34:
35: fd = open_ih(dev);
36: if (fd == -1) {
37: goto out;
38: }
39:
40: if (read_io(fd, magic, 2) != 2) {
41: debug("Can't read magic header\n");
42: retval = LOADER_NOT_SUPPORT;
43: goto out;
44: }
45:
46: if (!is_forth(magic)) {
47: debug("No forth source image\n");
48: retval = LOADER_NOT_SUPPORT;
49: goto out;
50: }
51:
52: /* Calculate the file size by seeking to the end of the file */
53: seek_io(fd, -1);
54: forthsize = tell(fd);
55: forthtext = malloc(forthsize+1);
56: seek_io(fd, 0);
57:
58: printk("Loading forth source ...");
59: if ((size_t)read_io(fd, forthtext, forthsize) != forthsize) {
60: printk("Can't read forth text\n");
61: goto out;
62: }
63: forthtext[forthsize]=0;
64: printk("ok\n");
65:
66: // Initialise saved-program-state
67: PUSH((ucell)forthtext);
68: feval("saved-program-state >sps.entry !");
69: PUSH((ucell)forthsize);
70: feval("saved-program-state >sps.file-size !");
71: feval("forth saved-program-state >sps.file-type !");
72:
73: feval("-1 state-valid !");
74:
75: retval=0;
76:
77: out:
78: //if (forthtext)
79: // free(forthtext);
80: return retval;
81: }
82:
83: void
84: forth_init_program(void)
85: {
86: // Currently not implemented
87: feval("0 state-valid !");
88: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.