mingw64 기준.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define EXTENSION ".srt" // default extension for output
#define BODY "<BODY>"
#define BUFFER 65535
int error (int); // message from table
void killbr(char *);
int killtags(char *);
int copy_kill_space(char *, char *);
int convert_t(long int, char *);
void BrLine(char *);
int Check_empty(char *);
void cmdCheck(char *);
void change_extension(char *in, char *out);
FILE *input;
FILE *output;
char *buffer;
char * inputline;
char *outputline;
char *temp, *temp2, *temp3;
long int time_begin = 0;
long int time_end = 0;
char time_b[32];
char time_e[32];
int N = 1;
int printable=0;
int STRING_LENGTH = 70;
int main(int argc, char* argv[])
{
int flag = 0, flag2 = 0;
char *in_filename = (char*)malloc(255);
char *out_filename = (char*)malloc(255);
strcpy(out_filename, "CON");
printf("\nConvert SMI to SRT...\n");
if (argc == 1) { // no param
error(0);
return 0;
}
else {
strcpy(in_filename, argv[1]);
if(argc > 2)
{
strcpy(out_filename, argv[2]);
} else {
change_extension(in_filename, out_filename);
}
if (argc > 3) cmdCheck(argv[3]);
}
input = fopen(in_filename, "r");
output = fopen(out_filename, "w");
if(!(size_t)output) return error(2);
if(!(size_t)input) return error(1);
if(!(buffer=(char*)malloc(BUFFER))) return error(3);
if(!(inputline=(char*)malloc(BUFFER)) || (size_t)inputline == -1) return error(3);
if(!(outputline=(char*)malloc(BUFFER)) || (size_t)outputline==-1) return error(3);
if(!(temp3=(char*)malloc(BUFFER)) || (size_t)temp3== -1) return error(3);
printf("Converting from %s to %s\n", in_filename, out_filename);
// SKIP INPUT FILE TILL FOUND "<BODY>"
while(!flag) {
if(!fgets(buffer, BUFFER, input)) return error(3);
buffer = strupr(buffer);
if(strstr(buffer, BODY)) flag = 1;
}
// MAIN LOOP
flag = 0;
while(!flag)
{
if(flag2)
{
flag2 = 0;
strcpy(buffer, temp3);
}
else
{
flag2 = 0;
if(!fgets(buffer, BUFFER, input))
{
flag = 1;
flag2 = 1;
continue;
} // EOF
}
*inputline = '\0';
strcpy(inputline, buffer);
strupr(buffer);
/*toupper(buffer);*/
temp = strstr(buffer, "<SYNC START=");
if(!temp) continue;
while(!flag2)
{
if(!fgets(buffer, BUFFER, input))
{
flag = 1;
flag2 = 1;
continue;
} // EOF
strcpy(temp3, buffer);
strupr(buffer);
temp2 = strstr(buffer, "<SYNC START=");
if(!temp2) strcat(inputline, temp3);
else flag2 = 1; // END OF SUB. LINE FOUND
}
strcpy(buffer, inputline);
strupr(buffer);
temp2 = strstr(buffer, "<SYNC START=");
sscanf(temp2, "<SYNC START=%d", &time_begin);
if(printable)
{
strcpy(time_e, time_b);
convert_t(time_begin, time_b);
time_end = time_begin;
fprintf(output, "%d\n", N++);
fprintf(output, "%s --> %s\n", time_e, time_b);
fprintf(output, "%s\n", outputline);
}
else
{
convert_t(time_begin, time_b);
strcpy(time_e, time_b);
time_end = time_begin;
}
// LINE CONVERTING
killbr(inputline);
killtags(inputline);
copy_kill_space(inputline, outputline);
BrLine(outputline);
printable = Check_empty(outputline);
}
fclose(input);
fclose(output);
free(buffer);
free(inputline);
free(outputline);
printf("converted a %d lines \n\n", N-1);
return 0;
}
int error(int code)
{
const char errors[][80] = {
"use: smi2srt.exe filename.smi [filename.srt] [-170] More see in readme.txe",
"Unable to open input file",
"Memory too low",
"<body> not found" };
printf("Error %d (%s)", code, errors[code]);
return code;
}
void killbr(char *line)
{
char *temp = strstr(line, "<br>");
while(temp)
{
*temp = '\n';
*(temp + 1) = ' ';
*(temp + 2) = ' ';
*(temp + 3) = ' ';
temp = strstr(temp, "<br>");
}
}
int killtags(char *line) {
char *temp = line;
while(*temp) {
if(*temp == '<') {
while(temp) {
if(*temp == '>') {
*temp = ' ';
break;
}
*(temp++) = ' ';
}
}
if(*temp == '&') {
while(*temp) {
if(*(temp+1) == ' ') {
temp++;
break;
}
if(*(temp + 2) == ';') {
*temp = ' ';
break;
}
*(temp++) = ' ';
}
}
else temp++;
}
return 0;
}
int copy_kill_space(char *in, char *out)
{
int sp = 1;
while(*in) {
if(*in == ' ' && sp == 1) {
in++;
continue;
}
if(*in == ' ' && sp == 0)
sp = 1;
else
sp = 0;
*(out++) = *(in++);
}
*out='\0';
return 0;
}
int convert_t(long int number, char *line)
{
long int temp;
long int temp2;
char vals[32][4];
temp = number / 3600000;
temp2 = number - temp * 3600000;
sprintf(vals[0], "%02d", temp);
temp = temp2 / 60000;
temp2 = temp2 - temp * 60000;
sprintf(vals[1], "%02d", temp);
temp = temp2 / 1000;
temp2 = temp2 - temp * 1000;
sprintf(vals[2], "%2d", temp);
temp = temp2;
sprintf(vals[3], "%03d", temp);
sprintf(line, "%s:%s:%s.%s", vals[0], vals[1], vals[2], vals[3]);
return 0;
}
void BrLine(char *line)
{
int i = 0;
int old = 0;
int flag = 0;
while(1) {
old = i;
i = i + STRING_LENGTH;
if(strlen(line) <= i) break;
while(i > old) {
if (*(line + i) == ' ') {
*(line + i) = '\n';
break;
}
if (*line == '\n') break;
i--;
}
}
// REMOVE DUPLICATED "\n"
flag = 0;
if(*line == '\n')
{
flag = 1;
*line = ' ';
}
while(*line) {
if(*line == '\n') {
if(flag) *line = ' ';
else flag = 1;
}
else if(*line != ' ') flag = 0;
line++;
}
}
int Check_empty(char *line) {
// return 0 if line contains only spaces
while(*line) {
if(*line != ' ' && *line != '\n') return 1;
line++;
}
return 0;
}
void cmdCheck(char *line) {
sscanf(line, "-l%d", &STRING_LENGTH);
}
void change_extension(char *in, char *out) {
char *temp;
strcpy(out, in);
temp = out + strlen(out);
while(temp != out) {
if(*temp == '.') {
*temp = '\0';
break;
}
temp--;
}
strcat(out, EXTENSION);
}