[comp.sys.amiga.programmer] Here is a Latttice C example of ARP file requester usage.

jkh@MEEPMEEP.PCS.COM (Jordan K. Hubbard) (04/26/91)

Well, a few people have asked for something like this, so here's
what I cobbled together in an hour or two after looking at the
docs.

It doesn't take advantage of the ARP requesters hooks for doing
pattern filtering or anything, but does the basic job.

----- cut -----
#!/bin/sh
# This is a shell archive (produced by shar 3.49)
# To extract the files from this archive, save it to a file, remove
# everything above the "!/bin/sh" line above, and type "sh file_name".
#
# made 04/25/1991 17:02 UTC by jkh@meepmeep
# Source directory /usr3
#
# existing files will NOT be overwritten unless -c is specified
#
# This shar contains:
# length  mode       name
# ------ ---------- ------------------------------------------
#    798 -rw-r--r-- test.c
#   2619 -rw-r--r-- arpreq.c
#    769 -rw-r--r-- arpreq.h
#
# ============= test.c ==============
if test -f 'test.c' -a X"$1" != X"-c"; then
	echo 'x - skipping test.c (File already exists)'
else
echo 'x - extracting test.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'test.c' &&
/*
X * Short test program for file requestor front-end.
X *
X * April 3rd, 1991.
X * Jordan K. Hubbard
X *
X */
X
#include "arpreq.h"
X
/*
X * We _must_ declare this here or the file requestor will not link.
X * I used to declare it in the file requestor code directly then realized
X * that this would hose an application using the arp requestor somewhere
X * else. Better to just have the "application" declare it. The file requestor
X * front-end will open it only if necessary.
X */
X
APTR ArpBase;
X
main()
{
X     char file[64], dir[64];
X     char path[128];
X
X     /* Set initial contents */
X     file[0] = '\0';
X     strcpy(dir, "SYS:");
X
X     if (ArpRequestFile(0, "This is a test", file, dir, path))
X	  printf("You selected %s\n", path);
X     else
X	  printf("File selection operation was cancelled.\n");
}
SHAR_EOF
chmod 0644 test.c ||
echo 'restore of test.c failed'
Wc_c="`wc -c < 'test.c'`"
test 798 -eq "$Wc_c" ||
	echo 'test.c: original size 798, current size' "$Wc_c"
fi
# ============= arpreq.c ==============
if test -f 'arpreq.c' -a X"$1" != X"-c"; then
	echo 'x - skipping arpreq.c (File already exists)'
else
echo 'x - extracting arpreq.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'arpreq.c' &&
#include "arpreq.h"
X
#pragma libcall ArpBase FileRequest 126 801
X
/*
X * April 3rd, 1991.
X * Jordan K. Hubbard
X * (My first amiga program! Wow! Golly!)
X *
X * This routine front-ends the ARP standard file requester.
X *
X * Calling syntax:
X *
X * int status;
X * status = ArpRequestFile(win, title, file, dir)
X * struct Window *s;
X * char *title, *file, *dir, *path;
X *
X * "window" is a pointer to a window structure - used solely
X * to determine which screen the requestor should pop up on (e.g. it
X * will share "window"'s screen). If NULL, the workbench screen is used.
X *
X * "title" is a constant text string used to display the banner message
X * at the top of the requestor.
X *
X * "file" and "dir" are pointers to space that the USER has allocated
X * to hold the resulting directory and file components of the selected
X * pathname.
X *
X * "path" is a convenience variable that will contain a *copy* of file
X * and dir (and so must also have sufficient space allocated for it by the
X * user) properly joined so that the resulting selected file can be
X * directly open()'d regardless of current directory. If NULL, it will
X * be ignored. "file" and "dir" remain initializaed properly in either
X * case.
X *
X * status is returned as TRUE (!0) if user has selected a file or FALSE (0)
X * if the selection was CANCEL'd.
X *
X */
X
static void pathify(char *, char *, char *);
X
int ArpRequestFile(struct Window *w, char *title, char *file, char *dir,
X		   char *path)
{
X     ArpFileRequester req;
X     int status, opened = 0;
X     
X     /* Open the ARP library if application hasn't already done so */
X     if (!ArpBase) {
X	  ArpBase = (APTR)OpenLibrary("arp.library", 0);
X	  if (ArpBase == (APTR)0) {
X	       printf("Can't open arp.library.\n");
X	       return 0;
X	  }
X	  else /* make sure I remember to close it */
X	       opened = 1;
X     }
X     /* Set up the important fields */
X     req.title = title;
X     req.file = file;
X     req.dir = dir;
X     req.window = w;
X     req.funcFlags = 0;	/* no custom function yet */
X     status = FileRequest(&req);
X     if (opened)	/* If I opened it, be neat */
X	  CloseLibrary(ArpBase);
X     if (status && path)
X	  pathify(path, dir, file);
X     return status;
}
X
/*
X * glue a directory and file specification together in such a way
X * that they form a complete path name that can be passed to open().
X */
static void pathify(char *path, char *dir, char *file)
{
X     int len = strlen(dir);
X     
X     if (!len)
X	  path[0] = '\0';
X     else {
X	  strcpy(path, dir);
X	  if (dir[len - 1] != ':') {
X	       path[len] = '/';
X	       path[len + 1] = '\0';
X	  }
X     }
X     strcat(path, file);
}
SHAR_EOF
chmod 0644 arpreq.c ||
echo 'restore of arpreq.c failed'
Wc_c="`wc -c < 'arpreq.c'`"
test 2619 -eq "$Wc_c" ||
	echo 'arpreq.c: original size 2619, current size' "$Wc_c"
fi
# ============= arpreq.h ==============
if test -f 'arpreq.h' -a X"$1" != X"-c"; then
	echo 'x - skipping arpreq.h (File already exists)'
else
echo 'x - extracting arpreq.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'arpreq.h' &&
/*
X * This is my first shot at defining the C glue necessary to use the
X * ARP file requester from C.
X *
X * April 3rd, 1991
X * Jordan K. Hubbard
X *
X */
X
#include <exec/types.h>
#include <intuition/intuition.h>
X
struct _filereq {
X     char *title;		/* Title of file requester	*/
X     char *file;		/* File name			*/
X     char *dir;			/* Starting directory		*/
X     struct Window *window;	/* Window to share screen with	*/
X     UBYTE funcFlags;		/* Tell ARP to call our stuff	*/
X     UBYTE reserved1;		/* like it says - hands off	*/
X     APTR func;			/* Custom callback		*/
X     ULONG reserved2;		/* No touchie here neither	*/
};
typedef struct _filereq ArpFileRequester;
X
extern int ArpRequestFile(struct Window *w, char *title, char *file,
X			  char *dir, char *path);
X
SHAR_EOF
chmod 0644 arpreq.h ||
echo 'restore of arpreq.h failed'
Wc_c="`wc -c < 'arpreq.h'`"
test 769 -eq "$Wc_c" ||
	echo 'arpreq.h: original size 769, current size' "$Wc_c"
fi
exit 0