void hb_buffer_reduce( hb_buffer_t * b, int size ) { if ( size < b->alloc / 8 || b->data == NULL ) { hb_buffer_t * tmp = hb_buffer_init( size ); hb_buffer_swap_copy( b, tmp ); memcpy( b->data, tmp->data, size ); hb_buffer_close( &tmp ); } }
void hb_srt_to_ssa(hb_buffer_t *sub_in, int line) { if (sub_in->size == 0) return; // null terminate input if not already terminated if (sub_in->data[sub_in->size-1] != 0) { hb_buffer_realloc(sub_in, ++sub_in->size); sub_in->data[sub_in->size - 1] = 0; } char * srt = (char*)sub_in->data; // SSA markup expands a little over SRT, so allocate a bit of extra // space. More will be realloc'd if needed. hb_buffer_t * sub = hb_buffer_init(sub_in->size + 80); char * ssa, *ssa_markup; int skip, len, pos, ii; // Exchange data between input sub and new ssa_sub // After this, sub_in contains ssa data hb_buffer_swap_copy(sub_in, sub); ssa = (char*)sub_in->data; sprintf((char*)sub_in->data, "%d,,Default,,0,0,0,,", line); pos = strlen((char*)sub_in->data); ii = 0; while (srt[ii] != '\0') { if ((ssa_markup = srt_markup_to_ssa(srt + ii, &skip)) != NULL) { len = strlen(ssa_markup); hb_buffer_realloc(sub_in, pos + len + 1); // After realloc, sub_in->data may change ssa = (char*)sub_in->data; sprintf(ssa + pos, "%s", ssa_markup); free(ssa_markup); pos += len; ii += skip; } else { hb_buffer_realloc(sub_in, pos + 4); // After realloc, sub_in->data may change ssa = (char*)sub_in->data; if (srt[ii] == '\r') { ssa[pos++] = '\\'; ssa[pos++] = 'N'; ii++; if (srt[ii] == '\n') { ii++; } } else if (srt[ii] == '\n') { ssa[pos++] = '\\'; ssa[pos++] = 'N'; ii++; } else { ssa[pos++] = srt[ii++]; } } } ssa[pos] = '\0'; sub_in->size = pos + 1; hb_buffer_close(&sub); }