[Back to NUMBERS SWAG index] [Back to Main SWAG index] [Original]
{===========================================================================
Date: 09-22-93 (20:14)
From: GREG VIGNEAULT
Subj: Pascal ISBN verification
Here's a snippet of TP code for the free SWAG archives. It verifies
ISBN numbers, via the embedded checksum ... }
(********************************************************************)
(* Turbo/Quick/StonyBrook Pascal source file: ISBN.PAS v1.0 GSV *)
(* Verify any International Standard Book Number (ISBN) ... *)
PROGRAM checkISBN;
CONST TAB = #9; { ASCII horizontal tab }
LF = #10; { ASCII line feed }
VAR ISBNstr : STRING[16];
loopc, ISBNlen, M, chksm : BYTE;
BEGIN {checkISBN}
WriteLn (LF,TAB,'ISBN Check v1.0 Copyright 1993 Greg Vigneault',LF);
IF ( ParamCount <> 1 ) THEN BEGIN { we want just one input parm }
WriteLn ( TAB, 'Usage: ISBN <ISBN#>', LF );
Halt(1);
END; {IF}
ISBNstr := ParamStr (1); { get the ISBN number }
Write ( TAB, 'Checking ISBN# ', ISBNstr, ' ...' );
{ eliminate any non-digit characters from the ISBN string... }
ISBNlen := 0;
FOR loopc := 1 TO ORD ( ISBNstr[0] ) DO
IF ( ISBNstr[ loopc ] IN ['0'..'9'] ) THEN BEGIN
INC ( ISBNlen );
ISBNstr[ ISBNlen ] := ISBNstr[ loopc ];
END; {IF & FOR}
{ an 'X' at the end of the ISBN affects the result... }
IF ( ISBNstr[ ORD ( ISBNstr[0] ) ] IN ['X','x'] ) THEN
M := 10
ELSE
M := ORD ( ISBNstr[ ISBNlen ] ) - 48;
ISBNstr[0] := CHR ( ISBNlen ); { new ISBN string length }
WriteLn ( 'reduced ISBN = ', ISBNstr ); WriteLn;
chksm := 0; { initialize checksum }
FOR loopc := 1 TO ISBNlen-1 DO
INC (chksm, ( ORD ( ISBNstr[ loopc ] ) - 48 ) * loopc );
Write ( TAB, 'ISBN ' );
IF ( ( chksm MOD 11 ) = M ) THEN
WriteLn ( 'is okay.' )
ELSE
WriteLn ( 'error!',#7 );
END {checkISBN}. (* Not for commercial retail. *)
[Back to NUMBERS SWAG index] [Back to Main SWAG index] [Original]