]> git.sur5r.net Git - cc65/commitdiff
Added enumdevdir showcasing the recently introduced device functions (together with...
authorol.sc <ol.sc@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 15 Oct 2012 18:52:40 +0000 (18:52 +0000)
committerol.sc <ol.sc@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 15 Oct 2012 18:52:40 +0000 (18:52 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@5851 b7a2c559-68d2-44c3-8de9-860c34a00d81

samples/Makefile
samples/README
samples/enumdevdir.c [new file with mode: 0644]

index 4499586cef9377a04626a30ac6f7bb8f63321079..046eb8fc98a359d391be9842f868f4331dd1bc87 100644 (file)
@@ -48,7 +48,7 @@ MY_ASM = --forget-inc-paths -I . -I $(CA65_INC)
 endif
 
 # This one comes with VICE
-C1541          = c1541
+C1541  = c1541
 
 
 # --------------------------------------------------------------------------
@@ -71,25 +71,26 @@ C1541       = c1541
 # List of executables. This list could be made target dependent by checking
 # $(SYS).
 
-EXELIST        =       ascii           \
-               diodemo         \
-               fire            \
-               gunzip65        \
-               hello           \
+EXELIST        =       ascii           \
+               diodemo         \
+               enumdevdir      \
+               fire            \
+               gunzip65        \
+               hello           \
                mandelbrot      \
-               mousedemo       \
-               multdemo        \
-               nachtm          \
-               ovrldemo        \
-               plasma          \
-               sieve           \
-               tgidemo
+               mousedemo       \
+               multdemo        \
+               nachtm          \
+               ovrldemo        \
+               plasma          \
+               sieve           \
+               tgidemo
 
 # --------------------------------------------------------------------------
 # Rules how to make each one of the binaries
 
 .PHONY:        all
-all:           $(EXELIST)
+all:   $(EXELIST)
 
 ascii:         ascii.o
 
@@ -152,7 +153,7 @@ endif
 # with the VICE emulator.
 
 .PHONY:        disk
-disk:          samples.d64
+disk:  samples.d64
 
 samples.d64:   all
        @$(C1541) -format samples,AA  d64 $@ > /dev/null
index 4310159d5742f836e250aa3d541a943e809f0aa7..4d677fa1a253290f0bb43de69cdfed241df96171 100644 (file)
@@ -19,42 +19,49 @@ Please note:
 List of supplied sample programs:
 
 -----------------------------------------------------------------------------
-Name:           ascii
+Name:          ascii
 Description:   Shows the ASCII (or ATASCII, PETSCII) codes of typed
                characters. Written and contributed by Greg King
                <gngking@erols.com>.
-Platforms:             All platforms with conio or stdio (compile time configurable).
+Platforms:     All platforms with conio or stdio (compile time configurable).
 
 -----------------------------------------------------------------------------
-Name:           diodemo
+Name:          diodemo
 Description:   A disc copy program written and contributed by Oliver
                Schmidt, <ol.sc@web.de>. Supports single or dual disc copy.
-Platforms:             The program does depend on conio and dio (direct disk i/o),
+Platforms:     The program does depend on conio and dio (direct disk i/o),
                so it does currently compile for the Atari and Apple ][
                machines.
 
 -----------------------------------------------------------------------------
-Name:           fire
+Name:          enumdevdir
+Description:   Enumerates all devices, directories and files. Written and
+               contributed by Oliver Schmidt, <ol.sc@web.de>.
+Platforms:     All systems with device enumeration and directory access
+               (currently the C64, the C128 and the Apple ][).
+
+-----------------------------------------------------------------------------
+Name:          fire
 Description:   Another graphics demo written by groepaz/hitmen.
-Platforms:             The program is currently only running on the C64, but should
+Platforms:     The program is currently only running on the C64, but should
                be portable to the C128 and CBM510 (and maybe more machines).
 
 -----------------------------------------------------------------------------
-Name:           gunzip65
+Name:          gunzip65
 Description:   A gunzip utility for 6502 based machines written by Piotr
                Fusik <fox@scene.pl>.
-Platforms:             Runs on all platforms with file I/O (currently the Atari, the
+Platforms:     Runs on all platforms with file I/O (currently the Atari, the
                Apple ][ and most Commodore machines).
 
 -----------------------------------------------------------------------------
-Name:          hello
+Name:          hello
 Description:   A nice "Hello world" type program that uses the conio
                console I/O library for output.
 Platforms:     Runs on all platforms that support conio, which means:
                Apple ][, Atari, C16, C64, C128, CBM510, CBM610, PET, Plus/4
 
 -----------------------------------------------------------------------------
-Name:           mandelbrot
+Name:          mandelbrot
 Description:   A mandelbrot demo using integer arithmetic. The demo was
                written by groepaz/hitmen and converted to cc65 using TGI
                graphics by Stephan Haubenthal.
@@ -62,43 +69,43 @@ Platforms:  Runs on all platforms that have TGI support:
                Apple ][, C64, C128, Oric Atmos, Geos and Lynx.
 
 -----------------------------------------------------------------------------
-Name:           mousedemo
+Name:          mousedemo
 Description:   Shows how to use the mouse.
-Platforms:             All systems with mouse and conio support:
+Platforms:     All systems with mouse and conio support:
                C64, C128, CBM510, Atari, Apple ][
 
 -----------------------------------------------------------------------------
-Name:           multidemo
+Name:          multidemo
 Description:   Shows how to combine multiple cc65 features incl. overlays
                and extended memory drivers. Written and contributed by
                Oliver Schmidt, <ol.sc@web.de>.
-Platforms:             All systems with an overlay linker config, disk directory
+Platforms:     All systems with an overlay linker config, disk directory
                access and EMD support (currently the C64, the C128,
                the Atari and the Apple ][).
 
 -----------------------------------------------------------------------------
-Name:           nachtm
+Name:          nachtm
 Description:   Plays "Eine kleine Nachtmusik" by Wolfgang Amadeus Mozart
 Platforms:     All systems that have the Commodore SID (Sound Interface
                Device):
                C64, C128, CBM510, CBM610
 
 -----------------------------------------------------------------------------
-Name:           overlaydemo
+Name:          overlaydemo
 Description:   Shows how to load overlay files from disk. Written and
                contributed by Oliver Schmidt, <ol.sc@web.de>.
-Platforms:             All systems with an overlay linker config (currently the C64,
+Platforms:     All systems with an overlay linker config (currently the C64,
                the C128, the Atari and the Apple ][).
 
 -----------------------------------------------------------------------------
-Name:           plasma
+Name:          plasma
 Description:   A fancy graphics demo written by groepaz/hitmen.
-Platforms:             The program needs a VIC, or a TED, so it runs on the following
+Platforms:     The program needs a VIC, or a TED, so it runs on the following
                systems:
                C64, C128, CBM510, Plus/4
 
 -----------------------------------------------------------------------------
-Name:           sieve
+Name:          sieve
 Description:   Implements the "Sieve of Eratosthenes" as a way to find all
                prime numbers in a specific number interval. Often used as
                a benchmark program.
@@ -107,9 +114,8 @@ Platforms:  All systems with conio and clock support:
                Apple ][ (without timing due to missing clock support)
 
 -----------------------------------------------------------------------------
-Name:           tgidemo
+Name:          tgidemo
 Description:   Shows some of the graphics capabilities of the "tiny graphics
                interface".
 Platforms:     Runs on all platforms that have TGI support:
                Apple ][, C64, C128, Oric Atmos, Geos and Lynx.
-
diff --git a/samples/enumdevdir.c b/samples/enumdevdir.c
new file mode 100644 (file)
index 0000000..5969c23
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Enumerate devices, directories and files.
+ *
+ * 2012-10-15, Oliver Schmidt (ol.sc@web.de)
+ *
+ */
+
+
+
+#include <stdio.h>
+#include <conio.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <device.h>
+#include <dirent.h>
+
+
+void printdir (char *newdir)
+{
+    char olddir[FILENAME_MAX];
+    char curdir[FILENAME_MAX];
+    DIR *dir;
+    struct dirent *ent;
+    char *subdirs = NULL;
+    unsigned dirnum = 0;
+    unsigned num;
+
+    getcwd (olddir, sizeof (olddir));
+    if (chdir (newdir)) {
+
+        /* If chdir() fails we just print the
+         * directory name - as done for files.
+         */
+        printf ("  Dir  %s\n", newdir);
+        return;
+    }
+
+    /* We call getcwd() in order to print the
+     * absolute pathname for a subdirectory.
+     */
+    getcwd (curdir, sizeof (curdir));
+    printf (" Dir %s:\n", curdir);
+
+    /* Calling opendir() always with "." avoids
+     * fiddling around with pathname separators.
+     */
+    dir = opendir (".");
+    while (ent = readdir (dir)) {
+
+        if (_DE_ISREG (ent->d_type)) {
+            printf ("  File %s\n", ent->d_name);
+            continue;
+        }
+
+        /* We defer handling of subdirectories until we're done with the
+         * current one as several targets don't support other disk i/o
+         * while reading a directory (see cc65 readdir() doc for more).
+         */
+        if (_DE_ISDIR (ent->d_type)) {
+            subdirs = realloc (subdirs, FILENAME_MAX * (dirnum + 1));
+            strcpy (subdirs + FILENAME_MAX * dirnum++, ent->d_name);
+        }
+    }
+    closedir (dir);
+
+    for (num = 0; num < dirnum; ++num) {
+        printdir (subdirs + FILENAME_MAX * num);
+    }
+    free (subdirs);
+
+    chdir (olddir);
+}
+
+
+void main (void)
+{
+    unsigned char device;
+    char devicedir[FILENAME_MAX];
+
+    /* Calling getfirstdevice()/getnextdevice() does _not_ turn on the motor
+     * of a drive-type device and does _not_ check for a disk in the drive.
+     */
+    device = getfirstdevice ();
+    while (device != INVALID_DEVICE) {
+        printf ("Device %d:\n", device);
+
+        /* Calling getdevicedir() _does_ check for a (formatted) disk in a
+         * floppy-disk-type device and returns NULL if that check fails.
+         */
+        if (getdevicedir (device, devicedir, sizeof (devicedir))) {
+            printdir (devicedir);
+        } else {
+            printf (" N/A\n");
+        }
+
+        device = getnextdevice (device);
+    }
+
+    cgetc ();
+}