Mercurial > libdvdnav.hg
annotate remap.c @ 96:2fcb4f228308 src
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
Not yet enabled. Will be enabled soon.
author | jcdutton |
---|---|
date | Tue, 17 Sep 2002 10:47:02 +0000 |
parents | |
children | b6834e6359cf |
rev | line source |
---|---|
96
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
1 #include <stdlib.h> |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
2 #include <string.h> |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
3 #include <stdio.h> |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
4 #include <sys/param.h> |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
5 #include <sys/fcntl.h> |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
6 #include <assert.h> |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
7 #include "remap.h" |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
8 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
9 struct block_s { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
10 int domain; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
11 int title; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
12 int program; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
13 unsigned long start_block; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
14 unsigned long end_block; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
15 }; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
16 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
17 struct remap_s { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
18 char *title; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
19 int maxblocks; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
20 int nblocks; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
21 int debug; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
22 struct block_s *blocks; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
23 }; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
24 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
25 remap_t* remap_new( char *title) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
26 remap_t *map = malloc( sizeof(remap_t)); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
27 map->title = strdup(title); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
28 map->maxblocks = 0; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
29 map->nblocks = 0; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
30 map->blocks = NULL; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
31 map->debug = 0; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
32 return map; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
33 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
34 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
35 static int compare_block( block_t *a, block_t *b) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
36 /* returns -1 if a precedes b, 1 if a follows b, and 0 if a and b overlap */ |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
37 if (a->domain < b->domain) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
38 return -1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
39 } else if (a->domain > b->domain) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
40 return 1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
41 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
42 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
43 if (a->title < b->title) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
44 return -1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
45 } else if (a->title > b->title) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
46 return 1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
47 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
48 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
49 if (a->program < b->program) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
50 return -1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
51 } else if (a->program > b->program) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
52 return 1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
53 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
54 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
55 if (a->end_block < b->start_block) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
56 return -1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
57 } else if (a->start_block > b->end_block) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
58 /* |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
59 * if a->start_block == b->end_block then the two regions |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
60 * aren't strictly overlapping, but they should be merged |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
61 * anyway since there are zero blocks between them |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
62 */ |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
63 return 1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
64 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
65 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
66 return 0; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
67 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
68 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
69 static block_t *findblock( remap_t *map, block_t *key) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
70 int lb = 0; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
71 int ub = map->nblocks - 1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
72 int mid; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
73 int res; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
74 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
75 while (lb <= ub) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
76 mid = lb + (ub - lb)/2; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
77 res = compare_block( key, &map->blocks[mid]); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
78 if (res < 0) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
79 ub = mid-1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
80 } else if (res > 0) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
81 lb = mid+1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
82 } else { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
83 return &map->blocks[mid]; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
84 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
85 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
86 return NULL; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
87 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
88 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
89 static void mergeblock( block_t *b, block_t tmp) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
90 if (tmp.start_block < b->start_block) b->start_block = tmp.start_block; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
91 if (tmp.end_block > b->end_block) b->end_block = tmp.end_block; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
92 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
93 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
94 static void remap_add_node( remap_t *map, block_t block) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
95 block_t *b; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
96 int n; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
97 b = findblock( map, &block); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
98 if (b) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
99 /* overlaps an existing block */ |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
100 mergeblock( b, block); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
101 } else { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
102 /* new block */ |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
103 if (map->nblocks >= map->maxblocks) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
104 map->maxblocks += 20; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
105 map->blocks = realloc( map->blocks, sizeof( block_t)*map->maxblocks); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
106 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
107 n = map->nblocks++; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
108 while (n > 0 && compare_block( &block, &map->blocks[ n-1]) < 0) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
109 map->blocks[ n] = map->blocks[ n-1]; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
110 n--; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
111 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
112 map->blocks[ n] = block; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
113 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
114 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
115 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
116 int parseblock( |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
117 char *buf, int *dom, int *tt, int *pg, |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
118 unsigned long *start, unsigned long *end) |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
119 { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
120 long tmp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
121 char *tok; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
122 char *epos; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
123 char *marker[]={"domain", "title", "program", "start", "end"}; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
124 int st = 0; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
125 tok = strtok( buf, " "); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
126 while (st < 5) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
127 if (strcmp(tok, marker[st])) return -st-1000; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
128 tok = strtok( NULL, " "); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
129 if (!tok) return -st-2000; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
130 tmp = strtol( tok, &epos, 0); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
131 if (*epos != 0 && *epos != ',') return -st-3000; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
132 switch (st) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
133 case 0: |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
134 *dom = (int)tmp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
135 break; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
136 case 1: |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
137 *tt = (int)tmp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
138 break; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
139 case 2: |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
140 *pg = (int)tmp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
141 break; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
142 case 3: |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
143 *start = tmp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
144 break; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
145 case 4: |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
146 *end = tmp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
147 break; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
148 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
149 st++; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
150 tok = strtok( NULL, " "); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
151 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
152 return st; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
153 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
154 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
155 remap_t* remap_loadmap( char *title) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
156 char buf[160]; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
157 char fname[MAXPATHLEN]; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
158 char *home; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
159 int res; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
160 FILE *fp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
161 block_t tmp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
162 remap_t *map; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
163 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
164 /* Build the map filename */ |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
165 home = getenv("HOME"); assert(home); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
166 strncpy(fname, home, sizeof(fname)); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
167 strncat(fname, "/.xine/", sizeof(fname)); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
168 strncat(fname, title, sizeof(fname)); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
169 strncat(fname, ".map", sizeof(fname)); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
170 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
171 printf("Loading %s.\n", fname); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
172 /* Open the map file */ |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
173 fp = fopen( fname, "r"); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
174 if (!fp) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
175 printf("Unable to find map file '%s'\n", fname); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
176 return NULL; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
177 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
178 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
179 /* Load the map file */ |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
180 map = remap_new( title); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
181 while (fgets( buf, sizeof(buf), fp) != NULL) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
182 if (buf[0] == '\n' || buf[0] == '#' || buf[0] == 0) continue; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
183 if (strncasecmp( buf, "debug", 5) == 0) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
184 map->debug = 1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
185 } else { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
186 res = parseblock( buf, |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
187 &tmp.domain, &tmp.title, &tmp.program, &tmp.start_block, &tmp.end_block); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
188 if (res != 5) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
189 printf("Ignoring map line (%d): %s\n", res, buf); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
190 continue; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
191 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
192 remap_add_node( map, tmp); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
193 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
194 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
195 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
196 if (map->nblocks == 0 && map->debug == 0) return NULL; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
197 return map; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
198 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
199 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
200 unsigned long remap_block( |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
201 remap_t *map, int domain, int title, int program, |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
202 unsigned long cblock, unsigned long offset) |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
203 { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
204 block_t key; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
205 block_t *b; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
206 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
207 if (map->debug) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
208 printf("%s: domain %d, title %d, program %d, start %lx, next %lx\n", |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
209 map->title, domain, title, program, cblock, cblock+offset); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
210 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
211 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
212 key.domain = domain; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
213 key.title = title; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
214 key.program = program; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
215 key.start_block = key.end_block = cblock + offset; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
216 b = findblock( map, &key); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
217 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
218 if (b) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
219 if (map->debug) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
220 printf("Redirected to %lx\n", b->end_block); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
221 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
222 return b->end_block - cblock; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
223 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
224 return offset; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
225 } |