projects
/
ruby-vorbistagger.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Reworked the loop that finds the first ogg page in the input stream.
[ruby-vorbistagger.git]
/
ext
/
vcedit.c
diff --git
a/ext/vcedit.c
b/ext/vcedit.c
index dfad95caf8a807bb5dee614e2590cfa567eaa726..46d68ee578231999db4d9f0b236fe0a234d44579 100644
(file)
--- a/
ext/vcedit.c
+++ b/
ext/vcedit.c
@@
-71,10
+71,12
@@
vcedit_state_free (vcedit_state *state)
}
static bool
}
static bool
-vcedit_state_init (vcedit_state *state)
+vcedit_state_init (vcedit_state *state
, const char *filename
)
{
state->refcount = 1;
{
state->refcount = 1;
+ strcpy (state->filename, filename);
+
return true;
}
return true;
}
@@
-85,6
+87,8
@@
vcedit_state_new (const char *filename)
size_t len;
len = strlen (filename);
size_t len;
len = strlen (filename);
+ if (len > PATH_MAX)
+ return NULL;
state = malloc (sizeof (vcedit_state) + len + 1);
if (!state)
state = malloc (sizeof (vcedit_state) + len + 1);
if (!state)
@@
-92,13
+96,11
@@
vcedit_state_new (const char *filename)
memset (state, 0, sizeof (vcedit_state));
memset (state, 0, sizeof (vcedit_state));
- if (!vcedit_state_init (state)) {
+ if (!vcedit_state_init (state
, filename
)) {
vcedit_state_free (state);
return NULL;
}
vcedit_state_free (state);
return NULL;
}
- strcpy (state->filename, filename);
-
return state;
}
return state;
}
@@
-262,8
+264,8
@@
vcedit_open (vcedit_state *state)
{
vcedit_error ret;
char *buffer;
{
vcedit_error ret;
char *buffer;
-
int bytes, i
;
- int
chunks = 0
;
+
size_t bytes, total = 0
;
+ int
i
;
ogg_packet *header;
ogg_packet header_main, header_comments, header_codebooks;
ogg_page og;
ogg_packet *header;
ogg_packet header_main, header_comments, header_codebooks;
ogg_page og;
@@
-274,22
+276,21
@@
vcedit_open (vcedit_state *state)
ogg_sync_init (&state->oy);
ogg_sync_init (&state->oy);
- while (1) {
- buffer = ogg_sync_buffer (&state->oy, CHUNKSIZE);
- bytes = fread (buffer, 1, CHUNKSIZE, state->in);
-
- ogg_sync_wrote (&state->oy, bytes);
-
- if (ogg_sync_pageout (&state->oy, &og) == 1)
- break;
-
+ do {
/* Bail if we don't find data in the first 40 kB */
/* Bail if we don't find data in the first 40 kB */
- if (
chunks++ >= 10
) {
+ if (
feof (state->in) || total >= (CHUNKSIZE * 10)
) {
ogg_sync_clear (&state->oy);
return VCEDIT_ERR_INVAL;
}
ogg_sync_clear (&state->oy);
return VCEDIT_ERR_INVAL;
}
- }
+
+ buffer = ogg_sync_buffer (&state->oy, CHUNKSIZE);
+
+ bytes = fread (buffer, 1, CHUNKSIZE, state->in);
+ total += bytes;
+
+ ogg_sync_wrote (&state->oy, bytes);
+ } while (ogg_sync_pageout (&state->oy, &og) != 1);
state->serial = ogg_page_serialno (&og);
state->serial = ogg_page_serialno (&og);