Mercurial > hg > xmms-sid
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;