File: testdb.c

package info (click to toggle)
csound 1%3A4.23f12-3
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 6,132 kB
  • ctags: 17,345
  • sloc: ansic: 101,063; cpp: 7,730; perl: 335; makefile: 318; tcl: 82
file content (86 lines) | stat: -rw-r--r-- 1,960 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "text.h"

char **strings;
long baseloc;
FILE *db;
long natlong(long lval)             /* coerce a bigendian long into a natural long */
{
    unsigned char benchar[4];
    unsigned char *p = benchar;
    long natlong;

    *(long *)benchar = lval;
    natlong = *p++;
    natlong <<= 8;
    natlong |= *p++;
    natlong <<= 8;
    natlong |= *p++;
    natlong <<= 8;
    natlong |= *p;
    return(natlong);
}

void getstring(int n)
{
    long loc;
    int len;

    if (strings[n]!=NULL) return;
    fseek(db, n*sizeof(long)+baseloc, SEEK_SET);
    fread(&loc, sizeof(long), 1, db);
    if (loc==0) {
      printf("No such string\n");
      strings[n] = "? ? ?";
      return;
    }
    loc = natlong(loc);
    fseek(db, loc, SEEK_SET);
    fread(&len, sizeof(int), 1, db);
    len = natlong(len);
    strings[n] = (char*)malloc(len);
    fread(strings[n], 1, len, db);
}

int main(int argc, char **argv)
{
    char header[20];
    char lang[30];
    long maxnum;
    int j;
    int order;

    db = fopen(argv[1], "rb");
    if (db == NULL) {
      fprintf(stderr, "Failed to find DB file\n");
      exit(1);
    }
    fread(&order, sizeof(int), 1, db);
    fread(header, sizeof(X_HEADER)-1, 1, db);
    fread(lang, sizeof(char), 30, db);
    fread(&maxnum, sizeof(long), 1, db);
    maxnum = natlong(maxnum);
    strings = (char**) malloc(maxnum*sizeof(char*));
    if (strings==NULL) {
      printf("No memory for strings\n");
      exit(1);
    }
    for (j=0; j<maxnum; j++) strings[j] = NULL;
    baseloc = ftell(db);
    printf("Headers %*s : %s (%d)\n",
           sizeof(X_HEADER)-1, header, lang, maxnum);
    for (;;) {
      int n;
      printf("String number?\n");
      scanf("%d", &n);
      if (n>=maxnum) {
        printf(">>>>>>>>>>>>>>>Test error: Too big\n");
        continue;
      }
      if (n<0) exit(0);
      getstring(n);
      printf("%s\n", strings[n]);
    }
}