login

<     >

2015-03-18 17:02:58 (UTC-03:00)

Marcel Rodrigues <marcelgmr@gmail.com>

Basic load and save functionality.

diff --git a/srtsync.c b/srtsync.c
new file mode 100644
index 0000000..8f351d2
--- /dev/null
+++ b/srtsync.c
@@ -0,0 +1,137 @@
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+
+#define BUFSZ 256
+
+typedef struct Line {
+    uint32_t on, off;
+    char *text;
+} Line;
+
+typedef struct Subtitles {
+    int bulk;
+    int count;
+    Line *lines;
+} Subtitles;
+
+uint32_t
+ts2ms(const char *ts)
+{
+    uint32_t ms = 0;
+    ms += atoi(ts) * 60 * 60 * 1000;
+    ms += atoi(ts + 3) * 60 * 1000;
+    ms += atoi(ts + 6) * 1000;
+    ms += atoi(ts + 9);
+    return ms;
+}
+
+void
+ms2ts(char *buffer, size_t bufsiz, uint32_t ms)
+{
+    unsigned h, m, s;
+    h = ms / (60 * 60 * 1000);
+    ms %= 60 * 60 * 1000;
+    m = ms / (60 * 1000);
+    ms %= 60 * 1000;
+    s = ms / (1000);
+    ms %= 1000;
+    snprintf(buffer, bufsiz, "%02u:%02u:%02u,%03u", h, m, s, ms);
+}
+
+Subtitles *
+load_subs(const char *path)
+{
+    Subtitles *subs;
+    FILE *fp;
+    char buffer[BUFSZ];
+    char text[4*BUFSZ];
+    char *ret = buffer;
+
+    fp = fopen(path, "r");
+    if (!fp)
+        return NULL;
+    subs = malloc(sizeof(*subs));
+    subs->bulk = 256;
+    subs->count = 0;
+    subs->lines = malloc(subs->bulk * sizeof(*subs->lines));
+    while (1) {
+        Line line;
+        /* Discard blank lines; get index or EOF. */
+        strcpy(buffer, "");
+        while (ret && strlen(buffer) <= 2)
+            ret = fgets(buffer, BUFSZ, fp);
+        if (!ret)
+            break;
+        assert(atoi(buffer) == subs->count + 1);
+        /* Get time stamps. */
+        fgets(buffer, BUFSZ, fp);
+        line.on = ts2ms(buffer);
+        line.off = ts2ms(buffer + 17);
+        /* Get text. */
+        fgets(text, BUFSZ, fp);
+        while (1) {
+            ret = fgets(buffer, BUFSZ, fp);
+            if (ret && strlen(buffer) > 2)
+                strcat(text, buffer);
+            else
+                break;
+        }
+        line.text = malloc(strlen(text) + 1);
+        strcpy(line.text, text);
+        /* Add line to subtitles. */
+        if (subs->count == subs->bulk) {
+            subs->bulk += subs->bulk >> 1;
+            subs->lines = realloc(subs->lines, subs->bulk * sizeof(*subs->lines));
+        }
+        subs->lines[subs->count++] = line;
+    }
+    fclose(fp);
+    return subs;
+}
+
+void
+save_subs(Subtitles *subs, const char *path)
+{
+    FILE *fp;
+    char bufon[13], bufoff[13];
+    int i;
+
+    fp = fopen(path, "w");
+    if (!fp)
+        return;
+    for (i = 0; i < subs->count; i++) {
+        Line line = subs->lines[i];
+        fprintf(fp, "%d\r\n", i + 1);
+        ms2ts(bufon, 13, line.on);
+        ms2ts(bufoff, 13, line.off);
+        fprintf(fp, "%s --> %s\r\n", bufon, bufoff);
+        fprintf(fp, "%s\r\n", line.text);
+    }
+    fclose(fp);
+}
+
+void
+free_subs(Subtitles **subs)
+{
+    int i;
+
+    for (i = 0; i < (*subs)->count; i++)
+        free((*subs)->lines[i].text);
+    free((*subs)->lines);
+    free(*subs);
+    *subs = NULL;
+}
+
+int
+main(int argc, char *argv[])
+{
+    Subtitles *subs;
+    assert(argc == 2);
+    subs = load_subs(argv[1]);
+    save_subs(subs, "test.srt");
+    free_subs(&subs);
+    return 0;
+}