changeset 2912:2f04b5f9a615

minor cleanups: a few #define's in subreader.h are now used instead of -1..9 same thing for line length instead of 1000..1001 renamed *_third() to *_subviewer() since it is what it is
author pl
date Thu, 15 Nov 2001 11:53:11 +0000
parents 7a8cc25832fa
children 74731185c5c9
files subreader.c subreader.h
diffstat 2 files changed, 72 insertions(+), 66 deletions(-) [+]
line wrap: on
line diff
--- a/subreader.c	Wed Nov 14 23:47:08 2001 +0000
+++ b/subreader.c	Thu Nov 15 11:53:11 2001 +0000
@@ -26,22 +26,17 @@
 char *sub_cp=NULL;
 #endif
 
+/* Maximal length of line of a subtitle */
+#define LINE_LEN 1000
 
 static float mpsub_position=0;
 
 int sub_uses_time=0;
 int sub_errs=0;
 int sub_num=0;          // number of subtitle structs
-int sub_format=-1;     // 0 for microdvd
-		      // 1 for SubRip
-		     // 2 for SubViewer
-		    // 3 for SAMI (smi)
-		   // 4 for vplayer format
-		  // 5 for RT format
-		 // 6 for ssa (Sub Station Alpha)
-		// 7 for ... erm ... dunnowhat. tell me if you know
-	       // 8 for the glorious MPsub
-	      // 9 for AQTitle
+
+/* Use the SUB_* constant defined in the header file */
+int sub_format=SUB_INVALID;
 
 int eol(char p) {
     return (p=='\r' || p=='\n' || p=='\0');
@@ -56,9 +51,9 @@
 
 
 subtitle *sub_read_line_sami(FILE *fd, subtitle *current) {
-    static char line[1001];
+    static char line[LINE_LEN+1];
     static char *s = NULL;
-    char text[1000], *p, *q;
+    char text[LINE_LEN+1], *p, *q;
     int state;
 
     current->lines = current->start = current->end = 0;
@@ -66,7 +61,7 @@
 
     /* read the first line */
     if (!s)
-	    if (!(s = fgets(line, 1000, fd))) return 0;
+	    if (!(s = fgets(line, LINE_LEN, fd))) return 0;
 
     do {
 	switch (state) {
@@ -122,7 +117,7 @@
 	}
 
 	/* read next line */
-	if (state != 99 && !(s = fgets (line, 1000, fd))) return 0;
+	if (state != 99 && !(s = fgets (line, LINE_LEN, fd))) return 0;
 
     } while (state != 99);
 
@@ -151,15 +146,15 @@
 }
 
 subtitle *sub_read_line_microdvd(FILE *fd,subtitle *current) {
-    char line[1001];
-    char line2[1001];
+    char line[LINE_LEN+1];
+    char line2[LINE_LEN+1];
     char *p, *next;
     int i;
 
     bzero (current, sizeof(subtitle));
 
     do {
-	if (!fgets (line, 1000, fd)) return NULL;
+	if (!fgets (line, LINE_LEN, fd)) return NULL;
     } while (sscanf (line, "{%ld}{%ld}%[^\r\n]", &(current->start), &(current->end),line2) <3);
 
     p=line2;
@@ -176,7 +171,7 @@
 }
 
 subtitle *sub_read_line_subrip(FILE *fd, subtitle *current) {
-    char line[1001];
+    char line[LINE_LEN+1];
     int a1,a2,a3,a4,b1,b2,b3,b4;
     char *p=NULL, *q=NULL;
     int len;
@@ -184,12 +179,12 @@
     bzero (current, sizeof(subtitle));
     
     while (1) {
-	if (!fgets (line, 1000, fd)) return NULL;
+	if (!fgets (line, LINE_LEN, fd)) return NULL;
 	if (sscanf (line, "%d:%d:%d.%d,%d:%d:%d.%d",&a1,&a2,&a3,&a4,&b1,&b2,&b3,&b4) < 8) continue;
 	current->start = a1*360000+a2*6000+a3*100+a4;
 	current->end   = b1*360000+b2*6000+b3*100+b4;
 
-	if (!fgets (line, 1000, fd)) return NULL;
+	if (!fgets (line, LINE_LEN, fd)) return NULL;
 
 	p=q=line;
 	for (current->lines=1; current->lines < SUB_MAX_TEXT; current->lines++) {
@@ -206,8 +201,8 @@
     return current;
 }
 
-subtitle *sub_read_line_third(FILE *fd,subtitle *current) {
-    char line[1001];
+subtitle *sub_read_line_subviewer(FILE *fd,subtitle *current) {
+    char line[LINE_LEN+1];
     int a1,a2,a3,a4,b1,b2,b3,b4;
     char *p=NULL;
     int i,len;
@@ -215,13 +210,13 @@
     bzero (current, sizeof(subtitle));
     
     while (!current->text[0]) {
-	if (!fgets (line, 1000, fd)) return NULL;
+	if (!fgets (line, LINE_LEN, fd)) return NULL;
 	if ((len=sscanf (line, "%d:%d:%d,%d --> %d:%d:%d,%d",&a1,&a2,&a3,&a4,&b1,&b2,&b3,&b4)) < 8)
 	    continue;
 	current->start = a1*360000+a2*6000+a3*100+a4/10;
 	current->end   = b1*360000+b2*6000+b3*100+b4/10;
 	for (i=0; i<SUB_MAX_TEXT;) {
-	    if (!fgets (line, 1000, fd)) break;
+	    if (!fgets (line, LINE_LEN, fd)) break;
 	    len=0;
 	    for (p=line; *p!='\n' && *p!='\r' && *p; p++,len++);
 	    if (len) {
@@ -239,8 +234,8 @@
 }
 
 subtitle *sub_read_line_vplayer(FILE *fd,subtitle *current) {
-	char line[1001];
-	char line2[1001];
+	char line[LINE_LEN+1];
+	char line2[LINE_LEN+1];
 	int a1,a2,a3,b1,b2,b3;
 	char *p=NULL, *next;
 	int i,len,len2,plen;
@@ -248,10 +243,10 @@
 	bzero (current, sizeof(subtitle));
 
 	while (!current->text[0]) {
-		if (!fgets (line, 1000, fd)) return NULL;
+		if (!fgets (line, LINE_LEN, fd)) return NULL;
 		if ((len=sscanf (line, "%d:%d:%d:%n",&a1,&a2,&a3,&plen)) < 3)
 			continue;
-		if (!fgets (line2, 1000, fd)) return NULL;
+		if (!fgets (line2, LINE_LEN, fd)) return NULL;
 		if ((len2=sscanf (line2, "%d:%d:%d:",&b1,&b2,&b3)) < 3)
 			continue;
 		// przewiń o linijkę do tyłu:
@@ -286,7 +281,7 @@
 	//TODO: This format uses quite rich (sub/super)set of xhtml 
 	// I couldn't check it since DTD is not included.
 	// WARNING: full XML parses can be required for proper parsing 
-    char line[1001];
+    char line[LINE_LEN+1];
     int a1,a2,a3,a4,b1,b2,b3,b4;
     char *p=NULL,*next=NULL;
     int i,len,plen;
@@ -294,7 +289,7 @@
     bzero (current, sizeof(subtitle));
     
     while (!current->text[0]) {
-	if (!fgets (line, 1000, fd)) return NULL;
+	if (!fgets (line, LINE_LEN, fd)) return NULL;
 	//TODO: it seems that format of time is not easily determined, it may be 1:12, 1:12.0 or 0:1:12.0
 	//to describe the same moment in time. Maybe there are even more formats in use.
 	//if ((len=sscanf (line, "<Time Begin=\"%d:%d:%d.%d\" End=\"%d:%d:%d.%d\"",&a1,&a2,&a3,&a4,&b1,&b2,&b3,&b4)) < 8)
@@ -327,13 +322,13 @@
 	    hour2, min2, sec2, hunsec2, nothing;
 	int num;
 	
-	char line[1000],
-	     line3[1000],
+	char line[LINE_LEN+1],
+	     line3[LINE_LEN+1],
 	     *line2;
 	char *tmp;
 
 	do {
-		if (!fgets (line, 1000, fd)) return NULL;
+		if (!fgets (line, LINE_LEN, fd)) return NULL;
 	} while (sscanf (line, "Dialogue: Marked=%d,%d:%d:%d.%d,%d:%d:%d.%d,"
 			"%[^\n\r]", &nothing,
 			&hour1, &min1, &sec1, &hunsec1, 
@@ -366,12 +361,12 @@
 }
 
 subtitle *sub_read_line_dunnowhat(FILE *fd,subtitle *current) {
-    char line[1001];
-    char text[1001];
+    char line[LINE_LEN+1];
+    char text[LINE_LEN+1];
 
     bzero (current, sizeof(subtitle));
 
-    if (!fgets (line, 1000, fd))
+    if (!fgets (line, LINE_LEN, fd))
 	return NULL;
     if (sscanf (line, "%ld,%ld,\"%[^\"]", &(current->start),
 		&(current->end), text) <3)
@@ -383,14 +378,14 @@
 }
 
 subtitle *sub_read_line_mpsub(FILE *fd, subtitle *current) {
-	char line[1000];
+	char line[LINE_LEN+1];
 	float a,b;
 	int num=0;
 	char *p, *q;
 
 	do
 	{
-		if (!fgets(line, 1000, fd)) return NULL;
+		if (!fgets(line, LINE_LEN, fd)) return NULL;
 	} while (sscanf (line, "%f %f", &a, &b) !=2);
 
 	mpsub_position += (a*100.0);
@@ -399,7 +394,7 @@
 	current->end=(int) mpsub_position;
 
 	while (num < SUB_MAX_TEXT) {
-		if (!fgets (line, 1000, fd)) return NULL;
+		if (!fgets (line, LINE_LEN, fd)) return NULL;
 		p=line;
 		while (isspace(*p)) p++;
 		if (eol(*p) && num > 0) return current;
@@ -421,13 +416,13 @@
 subtitle *previous_aqt_sub = NULL;
 
 subtitle *sub_read_line_aqt(FILE *fd,subtitle *current) {
-    char line[1001];
+    char line[LINE_LEN+1];
 
     bzero (current, sizeof(subtitle));
 
     while (1) {
     // try to locate next subtitle
-        if (!fgets (line, 1000, fd))
+        if (!fgets (line, LINE_LEN, fd))
 		return NULL;
         if (!(sscanf (line, "-->> %ld", &(current->start)) <1))
 		break;
@@ -438,14 +433,14 @@
     
     previous_aqt_sub = current;
 
-    if (!fgets (line, 1000, fd))
+    if (!fgets (line, LINE_LEN, fd))
 	return NULL;
 
     sub_readtext((char *) &line,&current->text[0]);
     current->lines = 1;
     current->end = current->start; // will be corrected by next subtitle
 
-    if (!fgets (line, 1000, fd))
+    if (!fgets (line, LINE_LEN, fd))
 	return current;;
 
     sub_readtext((char *) &line,&current->text[1]);
@@ -461,45 +456,45 @@
 }
 
 int sub_autodetect (FILE *fd) {
-    char line[1001];
+    char line[LINE_LEN+1];
     int i,j=0;
     char p;
     
     while (j < 100) {
 	j++;
-	if (!fgets (line, 1000, fd))
-	    return -1;
+	if (!fgets (line, LINE_LEN, fd))
+	    return SUB_INVALID;
 
 	if (sscanf (line, "{%d}{%d}", &i, &i)==2)
-		{sub_uses_time=0;return 0;}
+		{sub_uses_time=0;return SUB_MICRODVD;}
 	if (sscanf (line, "%d:%d:%d.%d,%d:%d:%d.%d",     &i, &i, &i, &i, &i, &i, &i, &i)==8)
-		{sub_uses_time=1;return 1;}
+		{sub_uses_time=1;return SUB_SUBRIP;}
 	if (sscanf (line, "%d:%d:%d,%d --> %d:%d:%d,%d", &i, &i, &i, &i, &i, &i, &i, &i)==8)
-		{sub_uses_time=1;return 2;}
+		{sub_uses_time=1;return SUB_SUBVIEWER;}
 	if (strstr (line, "<SAMI>"))
-		{sub_uses_time=1; return 3;}
+		{sub_uses_time=1; return SUB_SAMI;}
 	if (sscanf (line, "%d:%d:%d:",     &i, &i, &i )==3)
-		{sub_uses_time=1;return 4;}
+		{sub_uses_time=1;return SUB_VPLAYER;}
 	//TODO: just checking if first line of sub starts with "<" is WAY
 	// too weak test for RT
 	// Please someone who knows the format of RT... FIX IT!!!
 	// It may conflict with other sub formats in the future (actually it doesn't)
 	if ( *line == '<' )
-		{sub_uses_time=1;return 5;}
+		{sub_uses_time=1;return SUB_RT;}
 
 	if (!memcmp(line, "Dialogue: Marked", 16))
-		{sub_uses_time=1; return 6;}
+		{sub_uses_time=1; return SUB_SSA;}
 	if (sscanf (line, "%d,%d,\"%c", &i, &i, (char *) &i) == 3)
-		{sub_uses_time=0;return 7;}
+		{sub_uses_time=0;return SUB_DUNNOWHAT;}
 	if (sscanf (line, "FORMAT=%d", &i) == 1)
-		{sub_uses_time=0; return 8;}
+		{sub_uses_time=0; return SUB_MPSUB;}
 	if (sscanf (line, "FORMAT=TIM%c", &p)==1 && p=='E')
-		{sub_uses_time=1; return 8;}
+		{sub_uses_time=1; return SUB_MPSUB;}
 	if (strstr (line, "-->>"))
-		{sub_uses_time=0; return 9;}
+		{sub_uses_time=0; return SUB_MPSUB;}
     }
 
-    return -1;  // too many bad lines
+    return SUB_INVALID;  // too many bad lines
 }
 
 #ifdef DUMPSUBS
@@ -581,7 +576,7 @@
     {
 	    sub_read_line_microdvd,
 	    sub_read_line_subrip,
-	    sub_read_line_third,
+	    sub_read_line_subviewer,
 	    sub_read_line_sami,
 	    sub_read_line_vplayer,
 	    sub_read_line_rt,
@@ -595,7 +590,7 @@
     fd=fopen (filename, "r"); if (!fd) return NULL;
 
     sub_format=sub_autodetect (fd);
-    if (sub_format==-1) {printf ("SUB: Could not determine file format\n");return NULL;}
+    if (sub_format==SUB_INVALID) {printf ("SUB: Could not determine file format\n");return NULL;}
     printf ("SUB: Detected subtitle file format: %d\n",sub_format);
     
     rewind (fd);
--- a/subreader.h	Wed Nov 14 23:47:08 2001 +0000
+++ b/subreader.h	Thu Nov 15 11:53:11 2001 +0000
@@ -5,12 +5,23 @@
 extern int sub_uses_time;
 extern int sub_errs;
 extern int sub_num;         // number of subtitle structs
-extern int sub_format;     // 0 for microdvd
-			  // 1 for SubRip
-			 // 2 for the third format
-			// 3 for SAMI (smi)
-		       // 4 for vplayer format
-		      // other stuff in subreader.c
+
+// subtitle formats
+#define SUB_INVALID   -1
+#define SUB_MICRODVD  0
+#define SUB_SUBRIP    1
+#define SUB_SUBVIEWER 2
+#define SUB_SAMI      3
+#define SUB_VPLAYER   4
+#define SUB_RT        5
+#define SUB_SSA       6
+#define SUB_DUNNOWHAT 7		// FIXME what format is it ?
+#define SUB_MPSUB     8
+#define SUB_AQTITLE   9
+
+// One of the SUB_* constant above
+extern int sub_format;
+
 #define SUB_MAX_TEXT 5
 
 typedef struct {