(*
** -------------------------------------------------------------------------
** Program:  Basename
** Author:   Keith R. Burby
** Version:  0.4
** Date:     23.12.93
** Description:
** AmigaDOS 2.0/3.0 replacement for the ARP Shell's "Basename" command.
** Extract base filename from complete path and optionally delete suffix.
** -------------------------------------------------------------------------
*)

(*
  History:

  v0.4 (23.12.93)
  Optimised the code some.
  Took out extra online help.

  v0.3 (22.12.93)
  Added extra online help.

  v0.2 (10.12.93)
  Can now retreive the filename from pathnames longer than 255 characters.

  v0.1 (7.12.93)
  Checks version of dos.library and exits if not 36 or greater.
  Suffix checking is now case insensitive.

  v0.0 (6.12.93)
  First Edition
*)


MODULE Basename;

  IMPORT
    (* NoGuru, *)
    d := Dos,
    s := Strings,
    u := Utility,
    SYS := SYSTEM;

  CONST
    DosLibVer = 36;
    PrgName = "Basename\o"
              "$VER: Basename 0.4 (23.12.93) Keith R. Burby";
    ArgTemplate = "NAME/A,SUFFIX";

  TYPE
    ArgArray = STRUCT (dummy: d.ArgsStruct)
      Name, Suffix: d.ArgString;
    END;

  VAR
    ErrNum: LONGINT;


  PROCEDURE GetBasename(): LONGINT;

    VAR
      bName, cName: d.ArgString;
      MyArgs: ArgArray;
      MyRDArgs: d.RDArgsPtr;

    BEGIN
      MyRDArgs := d.ReadArgs(ArgTemplate, MyArgs, NIL);
      IF (MyRDArgs # NIL) THEN
        bName := d.FilePart(MyArgs.Name^);
        IF (MyArgs.Suffix # NIL) THEN
          cName := SYS.ADR(bName[s.Length(bName^) - s.Length(MyArgs.Suffix^)]);
          IF(u.Stricmp(cName^, MyArgs.Suffix^) = 0) THEN
            cName[0] := "\o";
          END;
        END;
        d.PrintF("%s\n", bName);
        d.FreeArgs(MyRDArgs);
      END;
      RETURN(d.IoErr());
    END GetBasename;


  BEGIN
    IF (d.dos.lib.version >= DosLibVer) THEN
      ErrNum := GetBasename();
      IF (ErrNum # 0) THEN
        IF (d.PrintFault(ErrNum, PrgName)) THEN
          HALT(10);
        ELSE
          HALT(20);
        END;
      END;
    ELSE
      HALT(DosLibVer);
    END;
  END Basename.
