Hi
Please tell me to go away if this request is inappropriate
Im trying to convert a C function into 4D
I know very very little C, so after 2 days I'm looking for some help
The C function looks like

struct toc {
        int     min;

        int     sec;
        int     frame;

};
struct toc cdtoc[100];

int
read_cdtoc_from_drive(void)

{

/* Do whatever is appropriate to read the TOC of the CD
 * into the cdtoc[] structure array.

}

 */
return (tot_trks);

int
cddb_sum(int n)

{

int     ret;
/* For backward compatibility this algorithm must not change */
ret = 0;

while (n > 0) {
        ret = ret + (n % 10);

        n = n / 10;
return (ret);

}

}

unsigned long
cddb_discid(int tot_trks)

{

int i,
t = 0,

        n = 0;
/* For backward compatibility this algorithm must not change */
i = 0;

while (i < tot_trks) {
        n = n + cddb_sum((cdtoc[i].min * 60) + cdtoc[i].sec);

i++; }

t = ((cdtoc[tot_trks].min * 60) + cdtoc[tot_trks].sec) -
    ((cdtoc[0].min * 60) + cdtoc[0].sec);

        return ((n % 0xff) << 24 | t << 8 | tot_trks);
main()

} {

}

int tot_trks;

tot_trks = read_cdtoc_from_drive();
printf("The discid is %08x", cddb_discid(tot_trks));



My version Looks Like

n:=0
t:=0
For ($i;1;$NoTracks)
n:=n+cddb_Sum(StartSeconds{$i})
End for
t:=$LastTrack-StartSeconds{1}
$DisckIDNo:=(n%255) << 24 | t << 8 | $NoTracks  // (n%255)<<24 results in a
huge negative number
$temp:=string($discIDNo;"&x")
DiscID:=substring($temp;3)    //This should result in an 8 character string
in hex


and the subroutine cddb_sum Like This

c_Longint($position;$addDigits)
$Position:=$1
$addDigits:=0;
While ($Position>0)
$addDigits:=$addDigits+($Position%10)
$Position:=int($Position/10)
End while
$0:=$adddigits

I think Im misunderstanding the functioning of cddb_sum

But I dont get anything sensible at the end

This is supposed to calculate a discID used in the lookup for CD titles
from FreeDB
The TOC (Table of contents) is derived from the information retreived from
"drutil TOC"
There is some code that creates an array of start times (in Seconds). an
end time and the number of tracks
This is the code that does that is



C_TEXT($in;$out;$err)
ARRAY LONGINT(StartSeconds;0)
Array Longint(StartFrames;0)
LAUNCH EXTERNAL PROCESS("Drutil toc";$in;$out;$err)
$pos:=Position("Last Track:";$out)
$NoTracksString:=Substring($out;$pos+27;2)
$NoTracks:=num($NoTracksString)

$pos:=Position("Lead-Out:";$out)

$LastTrackString:=substring($out;$pos+27;8)
ConvertTOCToSeconds ($LastTrackString)
$LastTrack:=<>Seconds
$posStart:=$pos
$count:=1

for($i;1;$NoTracks)
$pos:=position("Track";$out;$posStart)
$trackStartstring:=substring($out;$pos+15;8)
ConvertTOCToSeconds ($TrackStartString)
APPEND TO ARRAY(StartSeconds;<>Seconds)
$posStart:=$pos+2
End for


Thanks
-pn
**********************************************************************
4D Internet Users Group (4D iNUG)
FAQ:  http://lists.4d.com/faqnug.html
Archive:  http://lists.4d.com/archives.html
Options: http://lists.4d.com/mailman/options/4d_tech
Unsub:  mailto:4d_tech-unsubscr...@lists.4d.com
**********************************************************************

Reply via email to