/* ReqAsk. Requester based Ask replacement. Public Domain by Magnus Holmgren
 * in 1992.
 *
 * Compile with DICE:
 * Dcc -pr -2.0 -mS -proto -mRR -o ReqAsk ReqAsk.c dlib:amigas20.lib
 *
 * Other compilers (probably :) requires changes!
 */

#include <stdlib.h>
#include <string.h>
#include <exec/types.h>
#include <exec/execbase.h>
#include <dos/rdargs.h>
#include <dos/dos.h>
#include <intuition/intuition.h>
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>

extern struct DOSBase *DOSBase;
extern struct IntuitionBase *IntuitionBase;
extern struct ExecBase *SysBase;

struct Flags
{
  STRPTR BodyFmt;
  STRPTR GadgetFmt;
  STRPTR Title;
  STRPTR VarName;
  LONG   Global;
};

const TEXT Template_Msg[] = "BODY=BODYFMT/A,GAD=GADFMT,TITLE,"
                            "VAR=VARIABLENAME,GLOBAL/S";
const TEXT VersTag[] = "$VER: ReqAsk V1.2 (27.11.92)";
const TEXT OS2Required_Msg[] = "ReqAsk: You need OS 2.04+\n";

struct EasyStruct EasyStruct;
struct RDArgs *RDArgs;
struct Flags Flags;
ULONG Ret;
TEXT Buf[ 10 ];  /* That should be large enough.. :) */

ULONG sprintf( STRPTR, STRPTR, ... );
VOID CleanExit( STRPTR, ULONG );

/* Simply clean up and exit gracefully */
VOID CleanExit( STRPTR msg, ULONG code )
{
  /* Print any message */
  if( msg )
    Printf( "ReqAsk: %s\n", msg );

  if( RDArgs )
    FreeArgs( RDArgs );

  _exit( code );
}


_main()
{
  if( SysBase->LibNode.lib_Version < 37 )
  {
    BPTR out;

    if( out = ( BPTR ) Output() )
    {
      Write( out,
             OS2Required_Msg,
             sizeof( OS2Required_Msg ) - 1 );
      _exit( RETURN_FAIL );
    }
  }

  Flags.VarName = "ReqAskResult";

  if( !( RDArgs = ReadArgs( Template_Msg, ( ULONG * ) &Flags, NULL ) ) )
  {
    PrintFault( IoErr(), "ReqAsk" );
    CleanExit( NULL, RETURN_ERROR );
  }

  if( *( Flags.BodyFmt ) == '\0' )
    CleanExit( "no valid BODYFMT string", RETURN_ERROR );

  if( !Flags.GadgetFmt || *( Flags.GadgetFmt ) == '\0' )
    Flags.GadgetFmt = "Yes|No";

  EasyStruct.es_StructSize = sizeof( struct EasyStruct );
  EasyStruct.es_Title = Flags.Title;
  EasyStruct.es_TextFormat = Flags.BodyFmt;
  EasyStruct.es_GadgetFormat = Flags.GadgetFmt;

  sprintf( Buf, "%ld", EasyRequestArgs( NULL, &EasyStruct, NULL, NULL ) );

  if( *( Flags.VarName ) )
  {
    if( !SetVar( Flags.VarName,
                 Buf,
                 strlen( Buf ),
                 Flags.Global ? GVF_GLOBAL_ONLY : GVF_LOCAL_ONLY ) )
      CleanExit( "couldn't set result variable", RETURN_FAIL );
  }
  else
  {
    BPTR out;

    if( out = ( BPTR ) Output() )
    {
      Printf( "%s\n", Buf );
      Flush( out );
    }
    else
      CleanExit( NULL, RETURN_FAIL );
  }

  CleanExit( NULL, RETURN_OK );
}
