diff src/xs_length.c @ 392:b09d74eb71e6

Working on getting STIL and SLDB using completely dynamically allocated structures. Indentation cleanups, etc.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 31 May 2006 10:02:00 +0000
parents 3c239e4160d5
children f997b79a7251
line wrap: on
line diff
--- a/src/xs_length.c	Tue May 30 04:50:04 2006 +0000
+++ b/src/xs_length.c	Wed May 31 10:02:00 2006 +0000
@@ -29,25 +29,13 @@
 #include <string.h>
 
 
-/* Database handling functions
+/* Free memory allocated for given SLDB node
  */
-static t_xs_sldb_node *xs_sldb_node_new(void)
-{
-	t_xs_sldb_node *pResult;
-
-	/* Allocate memory for new node */
-	pResult = (t_xs_sldb_node *) g_malloc0(sizeof(t_xs_sldb_node));
-	if (!pResult)
-		return NULL;
-
-	return pResult;
-}
-
-
-static void xs_sldb_node_free(t_xs_sldb_node * pNode)
+static void xs_sldb_node_free(t_xs_sldb_node *pNode)
 {
 	if (pNode) {
 		/* Nothing much to do here ... */
+		g_free(pNode->sLengths);
 		g_free(pNode);
 	}
 }
@@ -55,7 +43,7 @@
 
 /* Insert given node to db linked list
  */
-static void xs_sldb_node_insert(t_xs_sldb * db, t_xs_sldb_node * pNode)
+static void xs_sldb_node_insert(t_xs_sldb *db, t_xs_sldb_node *pNode)
 {
 	assert(db);
 
@@ -73,9 +61,9 @@
 }
 
 
-/* Parses a time-entry in SLDB format
+/* Parse a time-entry in SLDB format
  */
-static gint xs_sldb_gettime(gchar * pcStr, size_t * piPos)
+static gint xs_sldb_gettime(gchar *pcStr, gint *piPos)
 {
 	gint iResult, iTemp;
 
@@ -111,37 +99,32 @@
 }
 
 
+/* Parse one SLDB definition line, return SLDB node
+ */
 t_xs_sldb_node * xs_sldb_read_entry(gchar *inLine)
 {
-	size_t linePos, savePos, tmpI, tmpLen;
+	gint linePos, savePos, i, tmpLen;
+	gboolean iOK;
 	t_xs_sldb_node *tmpNode;
 
 	/* Allocate new node */
-	if ((tmpNode = xs_sldb_node_new()) == NULL) {
-		XSERR("Error allocating new node. Fatal error.\n");
+	tmpNode = (t_xs_sldb_node *) g_malloc0(sizeof(t_xs_sldb_node));
+	if (!tmpNode) {
+		xs_error("Error allocating new node. Fatal error.\n");
 		return NULL;
 	}
 
 	/* Get hash value */
-#if (XS_MD5HASH_LENGTH != 16)
-#error Mismatch in hashcode length. Check against xs_md5.h and fix here.
-#endif
-	sscanf(&inLine[0], "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
-	       (guint *) & (tmpNode->md5Hash[0]), (guint *) & (tmpNode->md5Hash[1]),
-	       (guint *) & (tmpNode->md5Hash[2]), (guint *) & (tmpNode->md5Hash[3]),
-	       (guint *) & (tmpNode->md5Hash[4]), (guint *) & (tmpNode->md5Hash[5]),
-	       (guint *) & (tmpNode->md5Hash[6]), (guint *) & (tmpNode->md5Hash[7]),
-	       (guint *) & (tmpNode->md5Hash[8]), (guint *) & (tmpNode->md5Hash[9]),
-	       (guint *) & (tmpNode->md5Hash[10]), (guint *) & (tmpNode->md5Hash[11]),
-	       (guint *) & (tmpNode->md5Hash[12]), (guint *) & (tmpNode->md5Hash[13]),
-	       (guint *) & (tmpNode->md5Hash[14]), (guint *) & (tmpNode->md5Hash[15]));
-
+	linePos = 0;
+	for (i = 0; i < XS_MD5HASH_LENGTH; i++, linePos += 2) {
+		sscanf(&inLine[linePos], "%2x",
+		(guint *) &(tmpNode->md5Hash[i]));
+	}
+		
 	/* Get playtimes */
 	if (inLine[linePos] != 0) {
 		if (inLine[linePos] != '=') {
-			XSERR("'=' expected in SongLengthDB file '%s' line #%d, column #%d\n",
-				dbFilename, lineNum, linePos);
-
+			xs_error("'=' expected on column #%d.\n", linePos);
 			xs_sldb_node_free(tmpNode);
 			return NULL;
 		} else {
@@ -160,7 +143,7 @@
 			}
 			
 			if (!iOK) {
-				XSERR("Invalid plaaplaa\n");
+				xs_error("Invalid sub-tune length.\n");
 				xs_sldb_node_free(tmpNode);
 				return NULL;
 			}
@@ -168,19 +151,21 @@
 			/* Allocate memory for lengths */
 			tmpNode->sLengths = (gint *) g_malloc0(tmpNode->nLengths * sizeof(gint));
 			if (!tmpNode->sLengths) {
-				XSERR("Could not allocate memory for SongLengthDB entry.\n");
+				xs_error("Could not allocate memory for node.\n");
 				xs_sldb_node_free(tmpNode);
 				return NULL;
 			}
 			
 			/* Read lengths in */
-			tmpI = 0; linePos = savePos; iOK = TRUE;
+			i = 0;
+			linePos = savePos;
+			iOK = TRUE;
 			while ((linePos < tmpLen) && iOK) {
 				xs_findnext(inLine, &linePos);
 
-				if (tmpI < tmpNode->nLengths) {
-					tmpNode->sLengths[tmpI] = xs_sldb_gettime(inLine, &linePos);
-					tmpI++;
+				if (i < tmpNode->nLengths) {
+					tmpNode->sLengths[i] = xs_sldb_gettime(inLine, &linePos);
+					i++;
 				} else
 					iOK = FALSE;
 			}
@@ -199,18 +184,17 @@
 
 /* Read database to memory
  */
-gint xs_sldb_read(t_xs_sldb * db, gchar * dbFilename)
+gint xs_sldb_read(t_xs_sldb *db, gchar *dbFilename)
 {
 	FILE *inFile;
 	gchar inLine[XS_BUF_SIZE];
-	size_t lineNum, linePos;
-	gboolean iOK;
+	gint lineNum;
 	t_xs_sldb_node *tmpNode;
 	assert(db);
 
 	/* Try to open the file */
 	if ((inFile = fopen(dbFilename, "ra")) == NULL) {
-		XSERR("Could not open SongLengthDB '%s'\n", dbFilename);
+		xs_error("Could not open SongLengthDB '%s'\n", dbFilename);
 		return -1;
 	}
 
@@ -218,6 +202,7 @@
 	lineNum = 0;
 
 	while (!feof(inFile)) {
+		gint linePos;
 		fgets(inLine, XS_BUF_SIZE, inFile);
 		inLine[XS_BUF_SIZE - 1] = 0;
 		linePos = 0;
@@ -225,20 +210,25 @@
 
 		/* Check if it is datafield */
 		if (isxdigit(inLine[linePos])) {
-			size_t tmpI;
+			/* Check the length of the hash */
+			gint hashLen;
+			for (hashLen = 0; isxdigit(inLine[linePos]); hashLen++, linePos++);
 
-			/* Check the length of the hash */
-			for (tmpI = 0; isxdigit(inLine[linePos]); linePos++, tmpI++);
-
-			if (tmpI != XS_MD5HASH_LENGTH_CH) {
-				XSERR("Invalid hash in SongLengthDB file '%s' line #%d!\n", dbFilename, lineNum);
+			if (hashLen != XS_MD5HASH_LENGTH_CH) {
+				xs_error("Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n",
+					dbFilename, lineNum);
 			} else {
 				/* Parse and add node to db */
-				if ((tmpNode = xs_sldb_read_entry(inLine)) != NULL)
+				if ((tmpNode = xs_sldb_read_entry(inLine)) != NULL) {
 					xs_sldb_node_insert(db, tmpNode);
+				} else {
+					xs_error("Invalid entry in SongLengthDB file '%s' line #%d!\n",
+						dbFilename, lineNum);
+				}
 			}
-		} else if ((inLine[0] != ';') && (inLine[0] != '[')) {
-			XSERR("Invalid line in SongLengthDB file '%s' line #%d\n", dbFilename, lineNum);
+		} else if ((inLine[linePos] != ';') && (inLine[linePos] != '[')) {
+			xs_error("Invalid line in SongLengthDB file '%s' line #%d\n",
+				dbFilename, lineNum);
 		}
 
 	}
@@ -257,13 +247,13 @@
  */
 static gint xs_sldb_cmphash(t_xs_md5hash testHash1, t_xs_md5hash testHash2)
 {
-	register gint i, res = 0;
+	gint i, d;
 
 	/* Compute difference of hashes */
-	for (i = 0; (i < XS_MD5HASH_LENGTH) && (!res); i++)
-		res = (testHash1[i] - testHash2[i]);
+	for (i = 0, d = 0; (i < XS_MD5HASH_LENGTH) && !d; i++)
+		d = (testHash1[i] - testHash2[i]);
 
-	return res;
+	return d;
 }
 
 
@@ -445,11 +435,7 @@
 	t_xs_md5state inState;
 	t_xs_psidv1_header psidH;
 	t_xs_psidv2_header psidH2;
-#ifdef XS_BUF_DYNAMIC
 	guint8 *songData;
-#else
-	guint8 songData[XS_SIDBUF_SIZE];
-#endif
 	guint8 ib8[2], i8;
 	gint iIndex, iRes;
 
@@ -487,14 +473,12 @@
 		psidH2.reserved = xs_rd_be16(inFile);
 	}
 
-#ifdef XS_BUF_DYNAMIC
 	/* Allocate buffer */
 	songData = (guint8 *) g_malloc(XS_SIDBUF_SIZE * sizeof(guint8));
 	if (!songData) {
 		fclose(inFile);
 		return -3;
 	}
-#endif
 
 	/* Read data to buffer */
 	iRes = fread(songData, sizeof(guint8), XS_SIDBUF_SIZE, inFile);
@@ -511,10 +495,8 @@
 		xs_md5_append(&inState, songData, iRes);
 	}
 
-#ifdef XS_BUF_DYNAMIC
 	/* Free buffer */
 	g_free(songData);
-#endif
 
 	/* Append header data to hash */
 #define XSADDHASH(QDATAB) { ib8[0] = (QDATAB & 0xff); ib8[1] = (QDATAB >> 8); xs_md5_append(&inState, (guint8 *) &ib8, sizeof(ib8)); }
@@ -553,7 +535,7 @@
 
 /* Get song lengths
  */
-t_xs_sldb_node *xs_sldb_get(t_xs_sldb * db, gchar * pcFilename)
+t_xs_sldb_node *xs_sldb_get(t_xs_sldb *db, gchar *pcFilename)
 {
 	t_xs_sldb_node *pResult;
 	t_xs_md5hash dbHash;