From: groepaz (groepaz_at_gmx.net)
Date: 2001-08-13 22:36:55
ok ppl.... the first thing i come up with is a little hack that makes
it possible to pass arguments to a program very simelar to what you do
on a command line of some shell....
like:
RUN:arg1 arg2 arg3
this hack will read what you have written after the RUN command and
setup the respective variables (argc/argv) just as you would expect in
a standard C program.
oh yeah... this was developed on a c64, but should be possible to
convert to any other cbm-machine with minimum effort (will probably
work already on a vic-20)
appended below is a little test-program that just prints the arguments
that you gave them.... it also has an option to generate BASIC
error-messages (i included a modified version of exit() aswell that
does the job)
eg
RUN:!e 1
will print the error with the internal number 1
?too many files error
ready.
ahyeah... there are still some minor quirks to circumvent in this
implementation, if there is any interest i might fix that ;)
UZ: try this... seems to be the compiler bugs somewhere, some errors
are just tooooo weird to make any sence (and i cant really track them
down to a mistake in my code ;D) ... that is for SOME combinations of
arguments, the test-prog prints out total junk, there doesnt seem to
be some kind of system behind it though ... errrr ;D (too bad, i cant
find one on a quick test, i'll post a combination that fails if i
stumble about one once again)
;=)
....and now i am gone writing test programs for the file i/o stuff ;=)
UZ: is there a possibility of creating some directory for me on your
ftp-server where i could share my file-i/o stuff ? i guess it wouldnt
be too practical to send you emails every day when i make minor
changes...... but i'd really like to get some feedback/bug reports
this early, since it has been a while since i last looked at those
sources and i probably dont remember everything that still has to be
fixed. (and feedback will also help to write some documentation on the
non-standard functions)
--
Best regards,
groepaz mailto:groepaz_at_gmx.net
-file"hello.c"--------------------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
/* include command line processing */
#include "cmdline.c"
int main(int argc,char **argv) {
int i;
printf("commandline test (RUN:[ARGS])\n");
if(argv[1][0]=='!') {
switch(argv[1][1]){
/* create an error with specified code */
case 'e':
printf("error no.: %d\n",atoi(argv[2]));
return(atoi(argv[2]));
break;
}
} else {
/* number of arguments (argv[0] is always the full path+name of the executeable) */
printf(" argc : %d\n",argc);
/* arguments */
for(i=0;i<(argc);i++){
printf(" argv[%d] : %s\n",i,argv[i]);
}
}
/* return OK */
return(0);
}
-file"cmdline.h"------------------------------------------------------------
#ifndef _CMDLINE_H_
#define _CMDLINE_H_
#define CMDLINEMAXLEN 50
unsigned char *__cmdlinegetexename(void);
unsigned char *__cmdlinegetcmdline(void);
unsigned char __cmdlinetrimcmdline(unsigned char *ptr);
unsigned char **__cmdlinemakearray(unsigned char numargs,unsigned char *cmdline,unsigned char *nameptr);
int __cmdlinemain(int argc,char **argv);
void __cmdlineexit(unsigned char err);
#include <string.h>
#endif /* _CMDLINE_H_ */
-file"cmdline.c"------------------------------------------------------------
#include "cmdline.h"
/*
get program filename
*/
unsigned char *__cmdlinegetexename(void) {
unsigned char i,ii;
unsigned char *ptr,*nameptr;
/* get basic memory top (filename has been buffered here) */
ptr=(unsigned char*) (*((unsigned char*)0x37))+((*((unsigned char*)0x38))<<8);
/* length of filename */
ii=(*((unsigned char*)0xb7));
/* alloc space for a save copy of the filename string */
nameptr=(unsigned char*)malloc((ii+1)*sizeof(unsigned char));
ptr-=ii;
for(i=0;i<ii;i++){
nameptr[i]=ptr[i];
}
nameptr[i]=0;
return(nameptr);
}
/*
get pointer to command line arguments
*/
unsigned char *__cmdlinegetcmdline(void) {
unsigned char *ptr,*cmdline;
unsigned char i,len;
/* basic input buffer */
ptr=(unsigned char*)0x0200;
/* read until ':' */
i=0;while((ptr[i]!=0)&(i<CMDLINEMAXLEN)&(ptr[i]!=':')) i++;
/* if ':' found, get arguments-string from command line */
if(ptr[i]==':') {
i++;/* one more ;) */
len=strlen(&ptr[i]);
cmdline=(unsigned char*)malloc((len+1)*sizeof(unsigned char));
strcpy(cmdline,&ptr[i]);
return(cmdline);
/* return NULL if no arguments found */
} else {
return(NULL);
}
}
/*
remove spaces from command line & terminate args with zero
*/
unsigned char __cmdlinetrimcmdline(unsigned char *ptr) {
unsigned char src,dest,numargs,len;
if(ptr==NULL) return(0);
len=strlen(ptr);
numargs=0;src=0;dest=0;
while(src<len){
/* skip spaces */
while((ptr[src]!=0)&(src<CMDLINEMAXLEN)&(ptr[src]==' ')){
src++;
}
/* arg */
while((ptr[src]!=0)&(src<CMDLINEMAXLEN)&(ptr[src]!=' ')){
ptr[dest]=ptr[src];
src++;dest++;
}
ptr[dest]=0;dest++;src++;
numargs++;
}
return(numargs);
}
/*
create pointer-structure for array of arguments
*/
unsigned char **__cmdlinemakearray(unsigned char numargs,unsigned char *cmdline,unsigned char *nameptr){
unsigned char **argv;
unsigned char i;
argv=(unsigned char**)malloc(sizeof(unsigned char*)*(numargs));
argv[0]=nameptr;
for(i=1;(i<(numargs));i++,cmdline++){
argv[i]=cmdline;
while(*cmdline!=0) cmdline++;
}
return(argv);
}
void __cmdlineexit(unsigned char err){
/* restore the environment */
asm("\tsei");
asm("\tlda #$37");
asm("\tsta $01");
/* direct mode */
asm("\tlda #$ff");
asm("\tsta $3a");
/* clrch */
asm("\tjsr $ffcc");
/* stdin=keyboard */
asm("\tlda #$00");
asm("\tsta $13");
/* init basic */
asm("\tjsr $a67a");
asm("\tcli");
/* get error code */
asm("\tjsr popa");
/* reset stack */
asm("\tldx #$fb");
asm("\ttxs");
/* make error code */
asm("\ttax");
asm("\tbne @sk");
asm("\tldx #$80");
asm("@sk:");
/* jump to basic warmstart */
asm("\tcli");
asm("\tjmp $a437");
}
void main (void) {
unsigned char numargs;
unsigned char *nameptr,*cmdline,**argv;
int err;
/* get application filename string, alloc+copy to new string if needed */
nameptr=__cmdlinegetexename();
/* get command line string, alloc+copy to new string if needed */
cmdline=__cmdlinegetcmdline();
/* trim command line string and count args */
numargs=__cmdlinetrimcmdline(cmdline)+1; /* one arg is filename */
/* alloc and setup array structure */
argv=__cmdlinemakearray(numargs,cmdline,nameptr);
/* call the user's int main(int argc,char **argv) */
err=__cmdlinemain(numargs,argv);
/* clean up the environment variables */
free(argv);free(cmdline);free(nameptr);
/* exit to environment */
__cmdlineexit((unsigned char)err);
/* we will never return from here */
}
#define main(__argc,__argv) __cmdlinemain(__argc,__argv)
#define exit(__err) __cmdlineexit(__err)
----------------------------------------------------------------------
To unsubscribe from the list send mail to majordomo_at_musoftware.de with
the string "unsubscribe cc65" in the body(!) of the mail.
This archive was generated by hypermail 2.1.3 : 2001-12-14 22:05:41 CET