
/******************************************************************************

    MODULE
	ExpandArgs.c

    DESCRIPTION
	Does expanding of all arguments, that
	contain wildcards and passing of all
	other arguments.

    NOTES
	Kickstart 2.0+ required
	compiles w/ Dice 2.07R - inline-pragmas required
	compiles w/ SAS/C v6.51

    BUGS
	'ExpandArgs test c:b#? xyz' produced one
	$80000004 when compiled w/ OPTIMIZE !???

    TODO
	!TESTING!

    EXAMPLES
	> ExpandArgs c:f#? xyz
	c:Filenote
	xyz

    SEE ALSO
	dos.library/MatchFirst, dos.library/MatchNext

    INDEX

    HISTORY
	12-02-95 b_noll created

    AUTHOR
	Bernd Noll, Brunnenstrasse 55, D-67661 Kaiserslautern
	b_noll@informatik.uni-kl.de

******************************************************************************/

/**************************************
	    Includes
**************************************/

#ifndef   EXEC_LIBRARIES_H
# include <exec/libraries.h>
#endif /* EXEC_LIBRARIES_H */

#ifndef   CLIB_EXEC_PROTOS_H
# include <clib/exec_protos.h>
#endif /* CLIB_EXEC_PROTOS_H */

#ifndef   DOS_DOS_H
# include <dos/dos.h>
#endif /* DOS_DOS_H */

#ifndef   CLIB_DOS_PROTOS_H
# include <clib/dos_protos.h>
#endif /* CLIB_DOS_PROTOS_H */

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

/**************************************
	    Global Variables
**************************************/

#define MAXPATHLEN 256
#define MYFLAGS 	 /* (APF_DOWILD|) APF_DODOT| APF_FollowHLinks| */ 0
#define LFORMAT "%s\n"

/**************************************
	    Structures
**************************************/

struct _arg {

    STRPTR *par;

}; /* struct  */

/**************************************
	    Implementation
**************************************/

long _main (void)
{
    const char* version = "$VER: ExpandArgs 1.0 (13.02.95)";
    long retval = 20;
    struct Library* SysBase = *((struct Library**)4L);
    struct Library* DOSBase;

    if (DOSBase = OpenLibrary (DOSNAME, 37)) {
	struct _arg argv = { 0 };
	APTR   args;
	retval	 = 10;
	if (args = (void*)ReadArgs("/A/M", (LONG*)&argv, NULL)) {
	    BPTR stdout;
	    LONG   error;
	    STRPTR pat;
	    //STRPTR lformat = LFORMAT;
#define lformat LFORMAT
	    int    i;
	    struct AnchorPath  *ap;
	    UBYTE  apb[sizeof (*ap) + 8 + MAXPATHLEN];
	    //UBYTE  buffer[MAXPATHLEN];

	    retval = 0;
	    stdout = Output();

	    ap		      = (void *)(((ULONG)apb + 7) & ~7);
	    ap->ap_Strlen     = MAXPATHLEN;
	    ap->ap_BreakBits  = 0;
	    ap->ap_FoundBreak = 0;
	    //ap->ap_ = ;


	    for (i = 0; pat = argv.par[i]; i++) {

		ap->ap_Flags  = MYFLAGS;

		for (error = MatchFirst(pat, ap); error == 0; error = MatchNext(ap)) {
		    FPrintf (stdout, lformat, ap->ap_Buf);
//FPrintf(Output(), "%ld\n", j++);
		} /* for */
		MatchEnd(ap);

		if (error != ERROR_NO_MORE_ENTRIES) { /* abnormal error */
		    if ((error == ERROR_OBJECT_NOT_FOUND) && !(ap->ap_Flags & APF_ITSWILD)) {
			FPrintf (stdout, lformat, pat);
		    } else {
			retval = 10;
			break;
		    } /* if */
		} /* if */
	    } /* for */

	    FreeArgs (args);
	} /* if */
	CloseLibrary (DOSBase);
    } /* if */
    return (retval);
} /* _main */

/******************************************************************************
*****  END ExpandArgs.c
******************************************************************************/

