Subversion Repositories SvarDOS

Rev

Rev 1277 | Rev 1290 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1277 Rev 1281
Line 20... Line 20...
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22
 * DEALINGS IN THE SOFTWARE.
22
 * DEALINGS IN THE SOFTWARE.
23
 */
23
 */
24
 
24
 
-
 
25
/* if WITHSTDIO is enabled, then remap file operations to use the standard
-
 
26
 * stdio amenities */
-
 
27
#ifdef WITHSTDIO
-
 
28
 
-
 
29
#include <stdio.h>   /* FILE, fopen(), fseek(), etc */
-
 
30
typedef FILE* FHANDLE;
-
 
31
#define FOPEN(x) fopen(x, "rb")
-
 
32
#define FCLOSE(x) fclose(x)
-
 
33
#define FSEEK(f,b) fseek(f,b,SEEK_CUR)
-
 
34
#define FREAD(f,t,b) fread(t, 1, b, f)
-
 
35
 
-
 
36
#else
-
 
37
 
25
#include <i86.h>
38
#include <i86.h>
-
 
39
typedef unsigned short FHANDLE;
-
 
40
 
-
 
41
#endif
-
 
42
 
26
#include <stdlib.h>  /* NULL */
43
#include <stdlib.h>  /* NULL */
27
#include <string.h>  /* memcmp(), strcpy() */
44
#include <string.h>  /* memcmp(), strcpy() */
28
 
45
 
29
#include "svarlang.h"
46
#include "svarlang.h"
30
 
47
 
Line 42... Line 59...
42
    if (((unsigned short *)ptr)[1] == 0) return(ptr + 2); /* end of strings - return an empty string */
59
    if (((unsigned short *)ptr)[1] == 0) return(ptr + 2); /* end of strings - return an empty string */
43
    ptr += ((unsigned short *)ptr)[1] + 4;
60
    ptr += ((unsigned short *)ptr)[1] + 4;
44
  }
61
  }
45
}
62
}
46
 
63
 
47
 
-
 
-
 
64
/* routines below are simplified (dos-based) versions of the libc FILE-related
-
 
65
 * functions. Using them avoids a dependency on FILE, hence makes the binary
-
 
66
 * smaller if the application does not need to pull fopen() and friends */
-
 
67
#ifndef WITHSTDIO
48
static unsigned short FOPEN(const char *s) {
68
static unsigned short FOPEN(const char *s) {
49
  unsigned short fname_seg = FP_SEG(s);
69
  unsigned short fname_seg = FP_SEG(s);
50
  unsigned short fname_off = FP_OFF(s);
70
  unsigned short fname_off = FP_OFF(s);
51
  unsigned short res = 0xffff;
71
  unsigned short res = 0; /* fd 0 is already used by stdout so it's a good error value */
52
  _asm {
72
  _asm {
53
    push dx
73
    push dx
54
    push ds
74
    push ds
55
 
75
 
56
    mov ax, fname_seg
76
    mov ax, fname_seg
Line 114... Line 134...
114
 
134
 
115
  return(res);
135
  return(res);
116
}
136
}
117
 
137
 
118
 
138
 
119
static void FJUMP(unsigned short handle, unsigned short bytes) {
139
static void FSEEK(unsigned short handle, unsigned short bytes) {
120
  _asm {
140
  _asm {
121
    push bx
141
    push bx
122
    push cx
142
    push cx
123
    push dx
143
    push dx
124
 
144
 
Line 131... Line 151...
131
    pop dx
151
    pop dx
132
    pop cx
152
    pop cx
133
    pop bx
153
    pop bx
134
  }
154
  }
135
}
155
}
136
 
156
#endif
137
 
157
 
138
int svarlang_load(const char *fname, const char *lang) {
158
int svarlang_load(const char *fname, const char *lang) {
139
  unsigned short langid;
159
  unsigned short langid;
140
  unsigned short fd;
-
 
141
  char hdr[4];
160
  char hdr[4];
142
  unsigned short buff16[2];
161
  unsigned short buff16[2];
-
 
162
  FHANDLE fd;
143
 
163
 
144
  langid = *((unsigned short *)lang);
164
  langid = *((unsigned short *)lang);
145
  langid &= 0xDFDF; /* make sure lang is upcase */
165
  langid &= 0xDFDF; /* make sure lang is upcase */
146
 
166
 
147
  fd = FOPEN(fname);
167
  fd = FOPEN(fname);
148
  if (fd == 0xffff) return(-1);
168
  if (!fd) return(-1);
149
 
169
 
150
  /* read hdr, should be "SvL\33" */
170
  /* read hdr, should be "SvL\33" */
151
  if ((FREAD(fd, hdr, 4) != 4) || (memcmp(hdr, "SvL\33", 4) != 0)) {
171
  if ((FREAD(fd, hdr, 4) != 4) || (memcmp(hdr, "SvL\33", 4) != 0)) {
152
    FCLOSE(fd);
172
    FCLOSE(fd);
153
    return(-3);
173
    return(-3);
Line 156... Line 176...
156
  /* read next lang id in file */
176
  /* read next lang id in file */
157
  while (FREAD(fd, buff16, 4) == 4) {
177
  while (FREAD(fd, buff16, 4) == 4) {
158
 
178
 
159
    /* is it the lang I am looking for? */
179
    /* is it the lang I am looking for? */
160
    if (buff16[0] != langid) { /* skip to next lang */
180
    if (buff16[0] != langid) { /* skip to next lang */
161
      FJUMP(fd, buff16[1]);
181
      FSEEK(fd, buff16[1]);
162
      continue;
182
      continue;
163
    }
183
    }
164
 
184
 
165
    /* found - but do I have enough memory space? */
185
    /* found - but do I have enough memory space? */
166
    if (buff16[1] >= svarlang_memsz) {
186
    if (buff16[1] >= svarlang_memsz) {