1// This file is part of SmallBASIC
2//
3// lowlevel device (OS) I/O
4//
5// This program is distributed under the terms of the GPL v2.0 or later
6// Download the GNU Public License (GPL) from www.gnu.org
7//
8// Copyright(C) 2000 Nicholas Christopoulos
9
10#include "config.h"
11
12#include "include/osd.h"
13#include "common/device.h"
14#include "common/smbas.h"
15#include "common/messages.h"
16#include "common/keymap.h"
17#include "common/inet.h"
18
19/**
20 * initialize all drivers
21 */
22int dev_init(int mode, int flags) {
23 dev_initfs();
24 dev_fgcolor = 0;
25 dev_bgcolor = (os_graphics) ? 15 : 0;
26 osd_devinit();
27
28 // init the keyboard map
29 keymap_init();
30
31 dev_viewport(0, 0, 0, 0);
32 dev_window(0, 0, 0, 0);
33
34 if (os_graphics) {
35 // dev_fgcolor + dev_bgcolor can be overridden in osd_devinit()
36 // otherwise left as default black text on white background
37 osd_settextcolor(dev_fgcolor, dev_bgcolor);
38 osd_setcolor(dev_fgcolor);
39 } else {
40 dev_fgcolor = 7;
41 dev_bgcolor = 0;
42 }
43
44 return 1;
45}
46
47/**
48 * restore device's mode
49 */
50int dev_restore() {
51 if (os_graphics) {
52 osd_refresh();
53 }
54 dev_closefs();
55 if (os_graphics) {
56 osd_devrestore();
57 }
58 net_close();
59 return 1;
60}
61
62/**
63 * CHECK FOR EVENTS
64 *
65 * wait == 0 check & return
66 * != 0 wait for an event
67 *
68 * returns 0 for no events in queue
69 */
70int dev_events(int wait_flag) {
71 return osd_events(wait_flag);
72}
73
74/**
75 * BEEP
76 */
77void dev_beep() {
78 if (!opt_mute_audio) {
79 osd_beep();
80 }
81}
82
83/**
84 * plays an OGG or MP3 file
85 */
86void dev_audio(const char *path) {
87 if (!opt_mute_audio) {
88 osd_audio(path);
89 }
90}
91
92/**
93 * plays a sound
94 */
95void dev_sound(int frq, int ms, int vol, int bgplay) {
96 if (!opt_mute_audio) {
97 osd_sound(frq, ms, vol, bgplay);
98 }
99}
100
101/**
102 * clear background sound queue
103 */
104void dev_clear_sound_queue() {
105 osd_clear_sound_queue();
106}
107
108/**
109 * printf
110 */
111void dev_printf(const char *format, ...) {
112 va_list args;
113 va_start(args, format);
114 unsigned size = vsnprintf(NULL, 0, format, args);
115 va_end(args);
116
117 if (size) {
118 char *buf = malloc(size + 1);
119 buf[0] = '\0';
120 va_start(args, format);
121 vsnprintf(buf, size + 1, format, args);
122 va_end(args);
123 buf[size] = '\0';
124 dev_print(buf);
125 free(buf);
126 }
127}
128
129/**
130 * In the FLTK build, prints to the LOG window, in other builds
131 * prints to the output device as per dev_printf
132 */
133void log_printf(const char *format, ...) {
134 va_list args;
135 va_start(args, format);
136 unsigned size = vsnprintf(NULL, 0, format, args);
137 va_end(args);
138
139 if (size) {
140 char *buf = malloc(size + 3);
141 buf[0] = '\0';
142 va_start(args, format);
143 vsnprintf(buf, size + 1, format, args);
144 va_end(args);
145
146 buf[size] = '\0';
147 int i = size - 1;
148 while (i >= 0 && isspace(buf[i])) {
149 buf[i--] = '\0';
150 }
151 strcat(buf, "\r\n");
152#if defined(IMPL_LOG_WRITE)
153 lwrite(buf);
154#else
155 dev_print(buf);
156#endif
157 free(buf);
158 }
159}
160
161#if !defined(_SDL)
162void dev_trace_line(int lineNo) {
163 dev_printf("<%d>", lineNo);
164}
165#endif
166
167#ifndef IMPL_LOG_WRITE
168void lwrite(const char *buf) {
169 fprintf(stderr, "%s\n", buf);
170}
171#endif
172
173/**
174 * Displays a fatal error message
175 */
176void panic(const char *fmt, ...) {
177 va_list argp;
178 va_start(argp, fmt);
179 vfprintf(stderr, fmt, argp);
180 dev_print("\nFatal error\n");
181 va_end(argp);
182 exit(EXIT_FAILURE);
183}
184