#include <dos/dos.h>
#include <dos/dosextens.h>
#include <proto/dos.h>
#include <proto/exec.h>

#define ACTION_FORMAT_ARGS (15777218)

UBYTE string[200];
UBYTE str_casesensitive[]="CASESENSITIVE \n";
UBYTE str_nodeldir[]="NODELDIR \n";

LONG main() {
  struct RDArgs *readarg;
  UBYTE template[]="DEVICE=DRIVE/A/K,NAME/A/K,CASESENSITIVE/S,NODELDIR/S\n";

  struct {char *device;
          char *name;
          ULONG casesensitive;
          ULONG nodeldir;} arglist={NULL};

  if((DOSBase=(struct DosLibrary *)OpenLibrary("dos.library",37))!=0) {
    if((readarg=ReadArgs(template,(LONG *)&arglist,0))!=0) {
      struct MsgPort *msgport;
      struct DosList *dl;
      UBYTE *devname=arglist.device;

      while(*devname!=0) {
        if(*devname==':') {
          *devname=0;
          break;
        }
        devname++;
      }

      dl=LockDosList(LDF_DEVICES|LDF_READ);
      if((dl=FindDosEntry(dl,arglist.device,LDF_DEVICES))!=0) {
        BPTR input;
        LONG errorcode=0;

        input=Input();
        msgport=dl->dol_Task;
        UnLockDosList(LDF_DEVICES|LDF_READ);

        PutStr("Press RETURN to begin formatting or CTRL-C to abort: ");
        Flush(Output());

        if(IsInteractive(input)!=DOSFALSE) {
          for(;;) {
            if((WaitForChar(input,100)==DOSTRUE)) {
              if(errorcode==0 && (errorcode=DoPkt(msgport,ACTION_INHIBIT,DOSTRUE,0,0,0,0))!=DOSFALSE) {
                UBYTE *src;
                UBYTE *dest=string;

                *dest=10;
                *(dest+1)=0;

                if(arglist.casesensitive!=0) {
                  src=str_casesensitive;

                  while((*dest++=*src++)!=0) {
                  }
                  dest-=2;
                }

                if(arglist.nodeldir!=0) {
                  src=str_nodeldir;

                  while((*dest++=*src++)!=0) {
                  }
                  dest-=2;
                }

                if((errorcode=DoPkt(msgport,ACTION_FORMAT_ARGS,(LONG)arglist.name,0x53465300,(LONG)string,0,0))==DOSFALSE) {
                  PrintFault(IoErr(),"error while initializing the drive");
                }

                DoPkt(msgport,ACTION_INHIBIT,DOSFALSE,0,0,0,0);
              }
              else {
                PrintFault(IoErr(),"error while locking the drive");
              }
              break;
            }
            else if(SetSignal(0L,SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) {
              PutStr("\n***Break\n");
              break;
            }
          }

          while(WaitForChar(input,0)==DOSTRUE) {
            FGetC(input);
          }
        }
      }
      else {
        VPrintf("Unknown device %s\n",&arglist.device);
        UnLockDosList(LDF_DEVICES|LDF_READ);
      }

      FreeArgs(readarg);
    }
    CloseLibrary((struct Library *)DOSBase);
  }
  return(0);
}
