[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]