home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
426.lha
/
QuickSort
/
quicksort.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-10-02
|
5KB
|
203 lines
/* A test program to demonstrate the direct variable interface to ARexx.
* Opens a public port called "VarTest" and then waits for REXX messages.
* The port stays open until a "CLOSE" command is received.
* Usage: run vartest
* Then send commands from within ARexx by "address 'VarTest' command"
*
* This version for Manx. WGL
*/
#include "exec/exec.h"
#include "rexx/storage.h"
#include "rexx/rxslib.h"
#include <stdio.h>
#include <math.h>
#include <functions.h>
struct RexxLib *RexxSysBase;
extern LONG CheckRexxMsg();
extern LONG GetRexxMsg();
extern LONG SetRexxMsg();
main(argc,argv)
int argc;
char **argv;
{
struct MsgPort MyPort;
struct RexxMsg *rmptr;
LONG test,quitflag,error;
char buffer[256];
char **strings = 0;
char *malloc();
int i,left,right,string_number;
int atoi(),cmp();
STRPTR value;
RexxSysBase = (struct RexxLib *)
OpenLibrary("rexxsyslib.library",(LONG) RXSVERS);
if (RexxSysBase == 0L) {
printf("Bad News -- no REXX library\n");
return(20L);
}
/* Initialize our message port */
InitPort(&MyPort,"QuickSortPort");
/* Make the port public */
AddPort(&MyPort);
for (;;) { /* wait for messages */
Wait(1L<<MyPort.mp_SigBit);
rmptr = (struct RexxMsg *) GetMsg(&MyPort);
/* Make sure it's a valid context */
if (CheckRexxMsg(rmptr)) {
if((test = strcmp(rmptr->rm_Args[0],"QSORT")) == 0) {
/* Get left and right bounds of string array to be sorted */
/* when called from and exec program having added QuickSortPort */
/* as a function host Arg[1] is QuickSortPort */
left = atoi(rmptr->rm_Args[1]);
right = atoi(rmptr->rm_Args[2]);
string_number = right - left + 1;
strings = (char **)AllocMem((long)string_number*4,MEMF_PUBLIC|MEMF_CLEAR);
if(strings==NULL) goto REPLY ;
/* copy RexxVariable array into strings */
for(i = left; i <= right;i++){
/* put name of stem in buffer */
sprintf(buffer,"%s.%d",rmptr->rm_Args[3],i);
/* Now get the string from the program */
if(error = GetRexxVar(rmptr,buffer,&value)) goto REPLY;
strings[i-left] = malloc(strlen((char*)value)+1);
strcpy(strings[i-left],(char *)value);
}
/* Now sort the strings array */
qs_string(strings,left-1,right-1) ;
/* Put sorted array back in old stem variable */
for(i = left; i <= right;i++){
/* put name of stem in buffer */
sprintf(buffer,"%s.%d",rmptr->rm_Args[3],i);
/* Now get the string from the program */
error = SetRexxVar(rmptr,buffer,strings[i-left],(long)strlen(strings[i-left]));
if(error) goto REPLY;
free(strings[i-left]);
strings[i-left]=NULL;
}
}
/* See whether it's the close command */
else quitflag = test = strcmp(rmptr->rm_Args[0],"CLOSE");
}
REPLY:
/* send it back */
if(test) {
rmptr->rm_Result1 = 5L;
rmptr->rm_Result2 = 1L;
}
else {
rmptr->rm_Result1 = 0L; /* return code */
rmptr->rm_Result2 = 0L; /* secondary result */
}
ReplyMsg(rmptr);
if(strings) {
for(i = 0 ; i< string_number; i++){
if( strings[i] ) free(strings[i]);
}
FreeMem(strings,(long)string_number*4L);
strings = NULL;
}
if (quitflag == 0L) break; /* all done? */
}
RemPort(&MyPort); /* unlink it */
FreePort(&MyPort);
/* release the port resources */
return(0L);
}
qs_string(item,left,right)
char *item[];
int left,right;
{
int i,j;
char *x,*y;
i = left; j=right;
x = item[(left+right)/2];
do {
while(strcmpu(item[i],x) < 0 && i <right) i++;
while(strcmpu(item[j],x) > 0 && j >left) j--;
if(i<=j) {
y = item[i];
item[i] = item[j];
item[j] = y;
i++;j--;
}
} while(i<=j);
if(left<j) qs_string(item,left,j);
if(i<right) qs_string(item,i,right);
}
strcmpu(s1,s2)
char *s1,*s2;
{
int swap = 1;
char *temp;
if (strlen(s1) < strlen(s2)){
temp = s1;
s1 = s2;
s2 = temp;
swap = -1;
}
while(*s1) {
if(toupper(*s1) - toupper(*s2))
return swap*(toupper(*s1) - toupper(*s2));
else {
s1++;
s2++;
}
}
return 0;
}