validate_name.bush

# File : validate_name.bush

    #!/usr/local/bin/bush
    --
    -- VALIDATE_NAME
    --
    -- Check a name for suspicious characters
    -- Created by Ken O. Burtch

    pragma restriction( no_external_commands );

    procedure validate_name is

    procedure usage is
    begin
      put( "usage: " )
       @( source_info.file );
      put_line( " string" );
      new_line;
      put_line( "  Check a name for suspicious characters." );
      new_line;
      command_line.set_exit_status( 0 );
    end usage;

    begin

    -- Usage

    if $# /= 1 then
       usage;
       return;
    elsif $1 = "-h" or $1 = "--help" then
       usage;
       return;
    end if;

    -- Name tests

    declare
      name : string := $1;
      ch   : character;
      lastWasComma  : boolean := false;
      lastWasPeriod : boolean := false;
      lastWasMinus  : boolean := false;
      lastWasApostrophe : boolean := false;
    begin
      command_line.set_exit_status( 192 );
      name := strings.trim( name, trim_end.both );
      if name = "" then
         put( standard_error, source_info.file )
             @( standard_error, ": name is missing" );
         new_line;
      elsif strings.length( name ) > 63 then
         put( standard_error, source_info.file )
             @( standard_error, ": name is unusually long" );
         new_line;
      elsif strings.length( name ) < 5 then
         put( standard_error, source_info.file )
             @( standard_error, ": name is unusually short" );
         new_line;
      end if;

      -- Name should start with a letter

      ch := strings.element( name, 1 );
      if not strings.is_letter( ch ) then
         put( standard_error, source_info.file )
             @( standard_error, ": name starts with an unusual letter - " )
             @( standard_error, ch );
         new_line;
      end if;

      -- Name should contain letters, commas or periods

      for i in 1..strings.length( name )-1 loop
          ch := strings.element( name, i );
          if ch = ' ' then
             null;
             lastWasComma := false;
             lastWasPeriod := false;
             lastWasMinus := false;
             lastWasApostrophe := false;
          elsif ch = '0' then
             put( standard_error, source_info.file )
                 @( standard_error, ": zero in name should probably be a O" );
             new_line;
          elsif ch = '1' then
             put( standard_error, source_info.file )
                 @( standard_error, ": one in name should probably be a l or i" );
             new_line;
          elsif ch = '<' then
             put( standard_error, source_info.file )
                 @( standard_error, ": < in name should probably be a comma" );
             new_line;
          elsif ch = '>' then
             put( standard_error, source_info.file )
                 @( standard_error, ": > in name should probably be a period" );
             new_line;
          elsif ch = '_' then
             put( standard_error, source_info.file )
                 @( standard_error, ": _ in name should probably be a dash" );
             new_line;
          elsif ch = '"' then
             put( standard_error, source_info.file )
                 @( standard_error, ": double quote in name should probably be an apostraphe" );
             new_line;
          elsif strings.is_letter( ch ) then
             lastWasComma := false;
             lastWasPeriod := false;
             lastWasMinus := false;
             lastWasApostrophe := false;
          elsif ch = "," then
             lastWasPeriod := false;
             lastWasMinus := false;
             lastWasApostrophe := false;
             if lastWasComma then
                put( standard_error, source_info.file )
                    @( standard_error, ": name contains a repeated comma" );
                new_line;
             else
                lastWasComma := true;
             end if;
          elsif ch = '-' then
             lastWasComma := false;
             lastWasPeriod := false;
             lastWasApostrophe := false;
             if lastWasMinus then
                put( standard_error, source_info.file )
                    @( standard_error, ": name contains a repeated dash" );
                new_line;
             else
                lastWasMinus := true;
             end if;
          elsif ch = "'" then
             lastWasComma := false;
             lastWasMinus := false;
             lastWasPeriod := false;
             if lastWasApostrophe then
                put( standard_error, source_info.file )
                    @( standard_error, ": name contains a repeated apostraphe" );
                new_line;
             else
                lastWasApostrophe := true;
             end if;
          elsif ch = "." then
             lastWasComma := false;
             lastWasMinus := false;
             lastWasApostrophe := false;
             if lastWasPeriod then
                put( standard_error, source_info.file )
                    @( standard_error, ": name contains a repeated period" );
                new_line;
             else
                lastWasPeriod := true;
             end if;
          else
             lastWasComma := false;
             lastWasPeriod := false;
             lastWasMinus := false;
             lastWasApostrophe := false;
             put( standard_error, source_info.file )
                 @( standard_error, ": name contains an unusual letter - " )
                 @( standard_error, ch );
             new_line;
         end if;
      end loop;

      -- Name should end with a letter

      ch := strings.element( name, positive( strings.length( name ) ) );
      if not strings.is_letter( ch ) then
         put( standard_error, source_info.file )
             @( standard_error, ": name ends with an unusual letter - " )
             @( standard_error, ch );
         new_line;
      end if;
    end;

      command_line.set_exit_status( 0 );
    end validate_name;