/***************************************************************************
* Description:
* A tool to adjust the timestamps of srt subtitle files.
* Version 0.1
* Author : wplxb
* Language: C
* Date : 2007-07-01
***************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_LINE_LEN 400
#define TIMESTAMP_LEN 27
void print_help(char * filename)
{
printf("Usage: %s [Options] file/n", filename);
printf("Options:/n");
printf(" +sec Add sec seconds to the subtitle file specified./n");
printf(" -sec Subtract sec seconds to the subtitle file specified./n");
printf(" --help Display this information./n");
printf(" -h Display this information./n");
printf(" -? Display this information./n");
printf("/n");
printf("Note that the adjusted subtitle will be outputed to the standard output./n");
}
void preprocess(int argc, char *argv[])
{
char * filename = "timestamp";
char * arg1;
if (1 == argc)
{
print_help(filename);
exit(1);
}
arg1 = argv[1];
if (0 == strcmp("-h", arg1)
|| 0 == strcmp("--help", arg1)
|| 0 == strcmp("-?", arg1))
{
print_help(filename);
exit(0);
}
else if (argc < 3)
{
print_help(filename);
exit(1);
}
else if ('+' != arg1[0] && '-' != arg1[0])
{
print_help(filename);
exit(1);
}
if (strspn(arg1 + 1, "0123456789") != strlen(arg1 + 1))
{
print_help(filename);
exit(1);
}
}
int is_timestamp_line(char * line)
{
if (!line)
{
return 0;
}
line = strpbrk(line, "0123456789");
if (line)
{
if (strlen(line) >= TIMESTAMP_LEN
&& ':' == line[2]
&& ':' == line[5]
&& ',' == line[8])
{
return 1;
}
}
return 0;
}
int main(int argc, char * argv[])
{
FILE * srt;
int seconds;
char timestamp_line[MAX_LINE_LEN];
preprocess(argc, argv);
seconds = atoi(argv[1] + 1);
if ('-' == argv[1][0])
{
seconds = -seconds;
}
if (NULL == (srt = fopen(argv[2], "r")))
{
printf("Can't open file /"%s/"!/n", argv[2]);
exit(errno);
}
/* The real process starts here. */
while (fgets(timestamp_line, sizeof(timestamp_line), srt))
{
if (is_timestamp_line(timestamp_line))
{
int start_hour;
int start_minute;
int start_second;
int start_millisecond;
int start_time;
int end_hour;
int end_minute;
int end_second;
int end_millisecond;
int end_time;
sscanf(timestamp_line, "%d", &start_hour);
sscanf(timestamp_line + 3, "%d", &start_minute);
sscanf(timestamp_line + 6, "%d", &start_second);
sscanf(timestamp_line + 9, "%d", &start_millisecond);
start_time = start_hour;
start_time = start_time * 60 + start_minute;
start_time = start_time * 60 + start_second;
start_time += seconds;
start_second = start_time % 60;
start_time /= 60;
start_minute = start_time % 60;
start_time /= 60;
start_hour = start_time;
sscanf(timestamp_line + 17, "%d", &end_hour);
sscanf(timestamp_line + 20, "%d", &end_minute);
sscanf(timestamp_line + 23, "%d", &end_second);
sscanf(timestamp_line + 26, "%d", &end_millisecond);
end_time = end_hour;
end_time = end_time * 60 + end_minute;
end_time = end_time * 60 + end_second;
end_time += seconds;
end_second = end_time % 60;
end_time /= 60;
end_minute = end_time % 60;
end_time /= 60;
end_hour = end_time;
printf("%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d/n",
start_hour, start_minute, start_second, start_millisecond,
end_hour, end_minute, end_second, end_millisecond);
}
else
{
printf("%s", timestamp_line);
}
}
fclose(srt);
return 0;
}