libcfe  0.12.1
some useful C-functions
id3.c
Go to the documentation of this file.
1 #include "config.h"
2 #include "id3.h"
3 
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <string.h>
7 
8 #include "len.h"
9 #include "int_to_bit.h"
10 #include "ustrncpy.h"
11 
12 #define ID3_MAJOR_VERSION 3
13 
15 {
17  t->version_rev = 0;
18  t->flags = 0;
19  t->size = 0;
20  t->size = 0;
21  t->frames = malloc(1);
22  (t->frames)[0] = '\0';
23  return 0;
24 }
25 
26 int ID3_tag_add_data(ID3_tag *tag, uint8_t t1, uint8_t t2, uint8_t t3, uint8_t t4, char *data)
27 {
29  return -1;
30 
31  size_t datalen = str_len(data);
32  if(data == NULL || datalen == 0)
33  return 0;
34 
35  /* the size of a frame is:
36  frame header: 10 bytes
37  encoding: 1 byte
38  data: str_len(data) bytes
39  */
40  size_t newsize = datalen + 10 + 1;
41  tag->frames = realloc(tag->frames, tag->size + newsize + 1);
42 
43  /* frame id */
44  (tag->frames)[tag->size] = t1;
45  (tag->frames)[tag->size + 1] = t2;
46  (tag->frames)[tag->size + 2] = t3;
47  (tag->frames)[tag->size + 3] = t4;
48 
49  /* content size */
50  unsigned char *tmp = NULL;
51  uint8_t n;
52  size_t len = int_to_bit1(datalen + 1, &tmp, 128); /* + 1 for the encoding byte */
53  for(n = 1; n <= 4; n++)
54  {
55  if(n <= len)
56  (tag->frames)[tag->size + 4 + (4 - n)] = tmp[len - n];
57  else
58  (tag->frames)[tag->size + 4 + (4 - n)] = 0;
59  }
60  free(tmp);
61  tmp = NULL;
62 
63  /* frame flags */
64  (tag->frames)[tag->size + 8] = 0;
65  (tag->frames)[tag->size + 9] = 0;
66 
67  /* encoding: 00 (ISO-8859-1) */
68  (tag->frames)[tag->size + 10] = 0;
69 
70  /* content */
71  ustrncpy(tag->frames + tag->size + 11, data, datalen);
72 
73  tag->size += newsize;
74  (tag->frames)[tag->size] = '\0';
75 
76  return 0;
77 }
78 
79 int ID3_tag_fwrite(ID3_tag *t, FILE *fp)
80 {
82  return -1;
83 
84  if(t->size == 0)
85  return 0;
86 
87  unsigned char *tag = malloc(10 + t->size + 1);
88  tag[0] = 73; // 'I'
89  tag[1] = 68; // 'D'
90  tag[2] = 51; // '3'
91  tag[3] = t->version_major;
92  tag[4] = t->version_rev;
93  tag[5] = t->flags;
94 
95  unsigned char *tmp = NULL;
96  uint8_t n;
97  size_t len = int_to_bit1(t->size, &tmp, 128);
98  for(n = 1; n <= 4; n++)
99  {
100  if(n <= len)
101  tag[6 + (4 - n)] = tmp[len - n];
102  else
103  tag[6 + (4 - n)] = 0;
104  }
105  free(tmp);
106  tmp = NULL;
107 
108  for(n = 0; n < t->size; n++)
109  tag[10 + n] = t->frames[n];
110 
111  tag[10 + t->size] = '\0';
112 
113 /* write first 10 + 't->size' bytes of 'tag' to the file */
114  fwrite(tag, 1, 10 + t->size, fp);
115 
116  t->version_major = 0;
117  t->version_rev = 0;
118  t->flags = 0;
119  t->size = 0;
120  free(t->frames);
121  t->frames = NULL;
122 
123  free(tag);
124  tag = NULL;
125 
126  return 0;
127 }
128 
129 int ID3_tag_write(ID3_tag *tag, char *filename)
130 {
131  FILE *fp = fopen(filename, "w");
132  int ret = ID3_tag_fwrite(tag, fp);
133  fclose(fp);
134 
135  return ret;
136 }
int ID3_tag_add_data(ID3_tag *tag, uint8_t t1, uint8_t t2, uint8_t t3, uint8_t t4, char *data)
Definition: id3.c:26
int ID3_tag_fwrite(ID3_tag *t, FILE *fp)
Definition: id3.c:79
#define str_len(s)
Shorthand for counting &#39;\0&#39; terminating strings. See _len for more info.
Definition: len.h:17
int ID3_tag_write(ID3_tag *tag, char *filename)
Definition: id3.c:129
size_t ustrncpy(unsigned char *dest, const char *src, size_t n)
Definition: ustrncpy.c:4
Definition: id3.h:7
int ID3_tag_init(ID3_tag *t)
Definition: id3.c:14
uint8_t version_rev
Definition: id3.h:10
#define ID3_MAJOR_VERSION
Definition: id3.c:12
unsigned char * frames
Definition: id3.h:13
uint8_t flags
Definition: id3.h:11
size_t int_to_bit1(unsigned long long i, unsigned char **s, unsigned int base)
Definition: int_to_bit.c:6
uint32_t size
Definition: id3.h:12
uint8_t version_major
Definition: id3.h:9