OSDN Git Service

f85021f02121cda0bc5d49aa1519df796a153d16
[rec10/rec10-git.git] / epgdump / util.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #include "aribstr.h"
6 #include "util.h"
7
8 int strrep(char *buf, char *mae, char *ato)
9 {
10     char *mitsuke, *findpos;
11         size_t maelen, atolen;
12         int shift;
13                     
14         findpos = buf;
15         maelen = strlen(mae);
16         atolen = strlen(ato);
17         shift = (int)(strlen(ato)-strlen(mae));
18
19         if (maelen == 0 || strstr(findpos, mae) == NULL) return 0;
20         while ((mitsuke = strstr(findpos, mae)) != NULL) {
21                 if (shift > 0) {
22                         memmove(mitsuke + shift, mitsuke, strlen(mitsuke) + 1);
23                 } else if (shift < 0) {
24                         memmove(mitsuke, mitsuke - shift, strlen(mitsuke) + shift + 1);
25                 }
26                 memmove(mitsuke, ato, atolen);
27                 findpos = mitsuke + atolen;
28         }
29         return 1;
30 }
31
32 int getBit(unsigned char *byte, int *pbit, int gbit) {
33         int pbyte = *pbit / 8;
34         unsigned char *fbyte = byte + pbyte;
35
36         int cutbit = *pbit - (pbyte * 8);
37         int lcutbit = 32 - (cutbit + gbit);
38
39         unsigned char tbuf[4]; /* intの最大32bit */
40         unsigned int tnum;
41
42         memcpy(tbuf, fbyte, sizeof(unsigned char) * 4);
43
44         /* 先頭バイトから不要bitをカット */
45         tbuf[0] = tbuf[0] << cutbit;
46         tbuf[0] = tbuf[0] >> cutbit;
47
48         /* intにしてしまう */
49         tnum = tbuf[0] << 24 | tbuf[1] << 16 | tbuf[2] << 8 | tbuf[3];
50
51         /* 後ろの不要バイトをカット */
52         tnum = tnum >> lcutbit;
53
54         *pbit += gbit;
55
56         return tnum;
57   
58 }
59
60 void getStr(char *tostr, unsigned char *byte, int *pbit, int len) {
61         char str[MAXSECLEN];
62         int pbyte = *pbit / 8;
63         unsigned char *fbyte = byte + pbyte;
64
65         memset(str, 0, sizeof(char) * MAXSECLEN);
66         memcpy(str, fbyte, len);
67
68         *pbit += (len * 8);
69   
70         AribToString(tostr, str, len);
71
72         return;
73   
74 }
75
76 int parseOTHERdesc(unsigned char *data) {
77         int boff = 0;
78         int descriptor_tag;
79         int descriptor_length;
80
81         descriptor_tag = getBit(data, &boff, 8);
82         descriptor_length = getBit(data, &boff, 8);
83
84         /* printf("other desc_tag:0x%x\n", descriptor_tag); */
85
86         return descriptor_length + 2;
87 }
88
89 void* allocCopy(void* src, int *boff, size_t size) {
90         void* mem = NULL;
91         if ( size == 0 ) return NULL;
92
93         mem = malloc(size);
94         memcpy(mem, src + *boff / 8, size);
95         *boff += size * 8;
96         return mem;
97 }
98
99 //#define BCD(n) ((n/100)<<8)|(((n%100)/10)<<4)|(n%10)
100 #define BCD(n) ((n>>4)*10+(n&0xf))
101
102 time_t parseMJD( unsigned char *data ) {
103         int tnum, year, mon, mday;
104         struct tm MJD;
105
106         tnum = (data[0] & 0xFF) << 8 | (data[1] & 0xFF);
107         year = (tnum - 15078.2) / 365.25;
108         mon  = ((tnum - 14956.1) - (int)(year * 365.25)) / 30.6001;
109         mday = (tnum - 14956) - (int)(year * 365.25) - (int)(mon * 30.6001);
110
111         if(mon == 14 || mon == 15) {
112                 year += 1;
113                 mon  -= 13;
114         } else {
115                 mon -= 1;
116         }
117
118         memset( &MJD, 0, sizeof(MJD) );
119         MJD.tm_year = year;
120         MJD.tm_mon  = mon - 1;
121         MJD.tm_mday = mday;
122
123         MJD.tm_hour = BCD(data[2]);
124         MJD.tm_min  = BCD(data[3]);
125         MJD.tm_sec  = BCD(data[4]);
126         return mktime( &MJD );
127 }
128