Mercurial > libdvdnav.hg
annotate remap.c @ 286:6fac6a613ea5 src
moved inclusion of inttypes.h from dvd_types.h to the including .c files
author | nicodvb |
---|---|
date | Sat, 21 Apr 2007 11:08:56 +0000 |
parents | 52877d182e96 |
children | f22a52d426a3 |
rev | line source |
---|---|
114 | 1 /* |
2 * This file is part of libdvdnav, a DVD navigation library. | |
3 * | |
4 * libdvdnav is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * libdvdnav is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License | |
15 * along with this program; if not, write to the Free Software | |
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA | |
17 * | |
18 * $Id$ | |
19 */ | |
20 | |
96
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
21 #include <stdlib.h> |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
22 #include <string.h> |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
23 #include <stdio.h> |
176 | 24 |
25 #ifndef _MSC_VER | |
96
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
26 #include <sys/param.h> |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
27 #include <sys/fcntl.h> |
176 | 28 #else |
29 #ifndef MAXPATHLEN | |
30 #define MAXPATHLEN 255 | |
31 #endif | |
32 #endif /* _MSC_VER */ | |
33 | |
96
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
34 #include <assert.h> |
286
6fac6a613ea5
moved inclusion of inttypes.h from dvd_types.h to the including .c files
nicodvb
parents:
285
diff
changeset
|
35 #include <inttypes.h> |
285
52877d182e96
moved all header inclusions from .h to .c files; my word, I've never seen such a horrible entanglement as in this mess
nicodvb
parents:
282
diff
changeset
|
36 #include "dvd_types.h" |
52877d182e96
moved all header inclusions from .h to .c files; my word, I've never seen such a horrible entanglement as in this mess
nicodvb
parents:
282
diff
changeset
|
37 #include "nav_types.h" |
52877d182e96
moved all header inclusions from .h to .c files; my word, I've never seen such a horrible entanglement as in this mess
nicodvb
parents:
282
diff
changeset
|
38 #include "ifo_types.h" |
96
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
39 #include "remap.h" |
285
52877d182e96
moved all header inclusions from .h to .c files; my word, I've never seen such a horrible entanglement as in this mess
nicodvb
parents:
282
diff
changeset
|
40 #include "vm/decoder.h" |
52877d182e96
moved all header inclusions from .h to .c files; my word, I've never seen such a horrible entanglement as in this mess
nicodvb
parents:
282
diff
changeset
|
41 #include "vm/vm.h" |
52877d182e96
moved all header inclusions from .h to .c files; my word, I've never seen such a horrible entanglement as in this mess
nicodvb
parents:
282
diff
changeset
|
42 #include "vm/vmcmd.h" |
52877d182e96
moved all header inclusions from .h to .c files; my word, I've never seen such a horrible entanglement as in this mess
nicodvb
parents:
282
diff
changeset
|
43 #include "dvdnav.h" |
114 | 44 #include "dvdnav_internal.h" |
96
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
45 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
46 struct block_s { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
47 int domain; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
48 int title; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
49 int program; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
50 unsigned long start_block; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
51 unsigned long end_block; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
52 }; |
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 struct remap_s { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
55 char *title; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
56 int maxblocks; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
57 int nblocks; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
58 int debug; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
59 struct block_s *blocks; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
60 }; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
61 |
212
6b67914ae021
port Daniel's changes to xine-lib cvs to minimize difference
mroi
parents:
176
diff
changeset
|
62 static remap_t* remap_new( char *title) { |
96
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
63 remap_t *map = malloc( sizeof(remap_t)); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
64 map->title = strdup(title); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
65 map->maxblocks = 0; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
66 map->nblocks = 0; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
67 map->blocks = NULL; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
68 map->debug = 0; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
69 return map; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
70 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
71 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
72 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
|
73 /* 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
|
74 if (a->domain < b->domain) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
75 return -1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
76 } else if (a->domain > b->domain) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
77 return 1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
78 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
79 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
80 if (a->title < b->title) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
81 return -1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
82 } else if (a->title > b->title) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
83 return 1; |
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 if (a->program < b->program) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
87 return -1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
88 } else if (a->program > b->program) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
89 return 1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
90 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
91 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
92 if (a->end_block < b->start_block) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
93 return -1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
94 } else if (a->start_block > b->end_block) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
95 /* |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
96 * 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
|
97 * aren't strictly overlapping, but they should be merged |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
98 * anyway since there are zero blocks between them |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
99 */ |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
100 return 1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
101 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
102 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
103 return 0; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
104 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
105 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
106 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
|
107 int lb = 0; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
108 int ub = map->nblocks - 1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
109 int mid; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
110 int res; |
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 while (lb <= ub) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
113 mid = lb + (ub - lb)/2; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
114 res = compare_block( key, &map->blocks[mid]); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
115 if (res < 0) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
116 ub = mid-1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
117 } else if (res > 0) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
118 lb = mid+1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
119 } else { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
120 return &map->blocks[mid]; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
121 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
122 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
123 return NULL; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
124 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
125 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
126 static void mergeblock( block_t *b, block_t tmp) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
127 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
|
128 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
|
129 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
130 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
131 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
|
132 block_t *b; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
133 int n; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
134 b = findblock( map, &block); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
135 if (b) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
136 /* overlaps an existing block */ |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
137 mergeblock( b, block); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
138 } else { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
139 /* new block */ |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
140 if (map->nblocks >= map->maxblocks) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
141 map->maxblocks += 20; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
142 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
|
143 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
144 n = map->nblocks++; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
145 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
|
146 map->blocks[ n] = map->blocks[ n-1]; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
147 n--; |
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 map->blocks[ n] = block; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
150 } |
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 |
212
6b67914ae021
port Daniel's changes to xine-lib cvs to minimize difference
mroi
parents:
176
diff
changeset
|
153 static int parseblock(char *buf, int *dom, int *tt, int *pg, |
6b67914ae021
port Daniel's changes to xine-lib cvs to minimize difference
mroi
parents:
176
diff
changeset
|
154 unsigned long *start, unsigned long *end) { |
96
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
155 long tmp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
156 char *tok; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
157 char *epos; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
158 char *marker[]={"domain", "title", "program", "start", "end"}; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
159 int st = 0; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
160 tok = strtok( buf, " "); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
161 while (st < 5) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
162 if (strcmp(tok, marker[st])) return -st-1000; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
163 tok = strtok( NULL, " "); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
164 if (!tok) return -st-2000; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
165 tmp = strtol( tok, &epos, 0); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
166 if (*epos != 0 && *epos != ',') return -st-3000; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
167 switch (st) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
168 case 0: |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
169 *dom = (int)tmp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
170 break; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
171 case 1: |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
172 *tt = (int)tmp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
173 break; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
174 case 2: |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
175 *pg = (int)tmp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
176 break; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
177 case 3: |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
178 *start = tmp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
179 break; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
180 case 4: |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
181 *end = tmp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
182 break; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
183 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
184 st++; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
185 tok = strtok( NULL, " "); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
186 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
187 return st; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
188 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
189 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
190 remap_t* remap_loadmap( char *title) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
191 char buf[160]; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
192 char fname[MAXPATHLEN]; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
193 char *home; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
194 int res; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
195 FILE *fp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
196 block_t tmp; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
197 remap_t *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 /* Build the map filename */ |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
200 home = getenv("HOME"); assert(home); |
282
918fe20358cb
replaced sequency of strncpy() and strncat() by 1 snprintf() and fixed off-by-1 possible buffer oveflow; patch by Diego Petteno'
nicodvb
parents:
212
diff
changeset
|
201 snprintf(fname, sizeof(fname), "%s/.dvdnav/%s.map", home, title); |
96
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
202 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
203 /* Open the map file */ |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
204 fp = fopen( fname, "r"); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
205 if (!fp) { |
114 | 206 fprintf(MSG_OUT, "libdvdnav: Unable to find map file '%s'\n", fname); |
96
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
207 return NULL; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
208 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
209 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
210 /* Load the map file */ |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
211 map = remap_new( title); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
212 while (fgets( buf, sizeof(buf), fp) != NULL) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
213 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
|
214 if (strncasecmp( buf, "debug", 5) == 0) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
215 map->debug = 1; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
216 } else { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
217 res = parseblock( buf, |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
218 &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
|
219 if (res != 5) { |
114 | 220 fprintf(MSG_OUT, "libdvdnav: Ignoring map line (%d): %s\n", res, buf); |
96
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
221 continue; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
222 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
223 remap_add_node( map, tmp); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
224 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
225 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
226 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
227 if (map->nblocks == 0 && map->debug == 0) return NULL; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
228 return map; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
229 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
230 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
231 unsigned long remap_block( |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
232 remap_t *map, int domain, int title, int program, |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
233 unsigned long cblock, unsigned long offset) |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
234 { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
235 block_t key; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
236 block_t *b; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
237 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
238 if (map->debug) { |
114 | 239 fprintf(MSG_OUT, "libdvdnav: %s: domain %d, title %d, program %d, start %lx, next %lx\n", |
96
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
240 map->title, domain, title, program, cblock, cblock+offset); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
241 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
242 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
243 key.domain = domain; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
244 key.title = title; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
245 key.program = program; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
246 key.start_block = key.end_block = cblock + offset; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
247 b = findblock( map, &key); |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
248 |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
249 if (b) { |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
250 if (map->debug) { |
114 | 251 fprintf(MSG_OUT, "libdvdnav: Redirected to %lx\n", b->end_block); |
96
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
252 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
253 return b->end_block - cblock; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
254 } |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
255 return offset; |
2fcb4f228308
Adding "Personalizing DVD Viewing" files from <kevin_smathers@hp.com>
jcdutton
parents:
diff
changeset
|
256 } |