#define VERSION_ASC "0.90"
-#define KEYB_BUFSZ 80
-#define PROMPT ">>> "
#ifdef __ATARI__
#define UPPERCASE /* define (e.g. for Atari) to convert filenames etc. to upper case */
+#define HAVE_SUBDIRS
+#endif
+
+#ifdef __APPLE2__
+#define HAVE_SUBDIRS
+#endif
+
+#ifdef __CC65__
+#define CHECK_SP
#endif
+#define KEYB_BUFSZ 80
+#define PROMPT ">>> "
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef __CC65__
#include <sys/stat.h>
#include <sys/param.h>
+#define HAVE_SUBDIRS
#else
#define MAXPATHLEN 64
#endif
#include <fcntl.h>
#include <dirent.h>
+#ifdef CHECK_SP
+extern unsigned int getsp(void); /* comes from getsp.s */
+#endif
+
#define CMD_NOTHING 0
#define CMD_INVALID 1
#define CMD_HELP 2
#define CMD_RENAME 9
#define CMD_COPY 10
#define CMD_PWD 11
+#define CMD_CLS 12
+#define CMD_VERBOSE 13
+static unsigned char verbose;
static unsigned char terminate;
static unsigned char cmd;
static unsigned char *cmd_asc, *arg1, *arg2, *arg3;
{ "ls", CMD_LS },
{ "dir", CMD_LS },
{ "md", CMD_MKDIR },
+#ifdef HAVE_SUBDIRS
{ "mkdir", CMD_MKDIR },
{ "rd", CMD_RMDIR },
{ "rmdir", CMD_RMDIR },
{ "cd", CMD_CHDIR },
{ "chdir", CMD_CHDIR },
+#endif
{ "rm", CMD_RM },
{ "del", CMD_RM },
{ "cp", CMD_COPY },
{ "mv", CMD_RENAME },
{ "ren", CMD_RENAME },
{ "pwd", CMD_PWD },
+#ifdef __ATARI__
+ { "cls", CMD_CLS },
+#endif
+ { "verbose", CMD_VERBOSE },
{ NULL, 0 }
};
{
unsigned char i = 0;
+#ifdef CHECK_SP
+ static char firstcall = 1;
+ static unsigned int good_sp;
+ unsigned int sp;
+ if (firstcall)
+ sp = good_sp = getsp();
+ else
+ sp = getsp();
+
+ if (sp != good_sp) {
+ printf("SP: 0x%04X ***MISMATCH*** 0x%04X\n", sp, good_sp);
+ }
+ else if (verbose)
+ printf("SP: 0x%04X\n", sp);
+#endif
+
arg1 = arg2 = arg3 = NULL;
/* issue prompt */
puts("cd, chdir - change directory or drive");
puts("md, mkdir - make directory or drive");
puts("rd, rmdir - remove directory or drive");
+#ifdef __ATARI__
+ puts("cls - clear screen");
+#endif
+ puts("verbose - set verbosity level");
puts("sorry, you cannot start programs here");
}
else
arg = ".";
+ if (verbose)
+ printf("Buffer addr: %p\n", arg);
dir = opendir(arg);
#ifdef __ATARI__
if (need_free) free(arg);
printf("remove failed: %s\n", strerror(errno));
}
+#ifdef HAVE_SUBDIRS
+
static void cmd_mkdir(void)
{
if (!arg1 || arg2) {
printf("malloc %u bytes failed: %s\n", MAXPATHLEN, strerror(errno));
return;
}
+ if (verbose)
+ printf("Buffer addr: %p\n", buf);
if (!getcwd(buf, MAXPATHLEN)) {
printf("getcwd failed: %s\n", strerror(errno));
free(buf);
free(buf);
}
+#endif /* #ifdef HAVE_SUBDIRS */
+
static void cmd_rename(void)
{
if (!arg2 || arg3) {
printf("malloc %u bytes failed: %s\n", cpbuf_sz, strerror(errno));
return;
}
+ if (verbose)
+ printf("Buffer addr: %p\n", buf);
while (1) {
if (srcfd == -1) {
if (dstfd >= 0) close(dstfd);
}
+#ifdef __ATARI__
+static void cmd_cls(void)
+{
+ printf("\f");
+}
+#endif
+
+static void cmd_verbose(void)
+{
+ unsigned long verb;
+ char *endptr;
+
+ if (!arg1 || arg2) {
+ puts("usage: verbose <level>");
+ return;
+ }
+
+ verb = strtoul(arg1, &endptr, 10);
+ if (verb > 255 || *endptr) {
+ puts("invalid verbosity level");
+ return;
+ }
+
+ verbose = verb;
+ printf("verbosity level set to %d\n", verbose);
+}
+
static void run_command(void)
{
switch (cmd) {
case CMD_QUIT: terminate = 1; return;
case CMD_LS: cmd_ls(); return;
case CMD_RM: cmd_rm(); return;
+#ifdef HAVE_SUBDIRS
case CMD_CHDIR: cmd_chdir(); return;
case CMD_MKDIR: cmd_mkdir(); return;
case CMD_RMDIR: cmd_rmdir(); return;
case CMD_PWD: cmd_pwd(); return;
+#endif
case CMD_RENAME: cmd_rename(); return;
case CMD_COPY: cmd_copy(); return;
+#ifdef __ATARI__
+ case CMD_CLS: cmd_cls(); return;
+#endif
+ case CMD_VERBOSE: cmd_verbose(); return;
}
}