콘텐츠로 건너뛰기
Home » [c/c++] SMI를 SRT로 컨버팅하기

[c/c++] SMI를 SRT로 컨버팅하기

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);
}
태그: