Annotation of uae/src/od-amiga/ami-rexx.c, revision 1.1.1.2

1.1       root        1:  /*
                      2:   * UAE - The Un*x Amiga Emulator
                      3:   * 
                      4:   * ami-rexx.c
                      5:   * 
                      6:   * Copyright 1996 Samuel Devulder.
                      7:   *
                      8:   * History:
                      9:   *     05/09/97: Added UAEEXE support.
1.1.1.2 ! root       10:   *    04/03/98: Added event-hack for SOUND(). Added do_inhibit_frame().
        !            11:   *    03/05/98: Modified currprefs to changed_prefs where necessary.
1.1       root       12:   */
                     13: 
1.1.1.2 ! root       14: /****************************************************************************/
        !            15: 
        !            16: #if defined(POWERUP)
        !            17: #include <exec/exec.h> /* sam: I've added this or else I have warnings about missing struct def. */
        !            18: #ifndef USE_CLIB
        !            19: #include <powerup/ppcproto/exec.h>
        !            20: #include <powerup/ppcproto/rexxsyslib.h>
        !            21: #include <powerup/ppcproto/dos.h>
        !            22: #else
        !            23: #include <clib/exec_protos.h>
        !            24: #include <clib/alib_protos.h>
        !            25: #endif
        !            26: #else
1.1       root       27: #include <proto/exec.h>
                     28: #include <proto/rexxsyslib.h>
                     29: #include <proto/dos.h>
                     30: #ifndef __SASC
                     31: #include <proto/alib.h>
                     32: #endif
1.1.1.2 ! root       33: #endif
1.1       root       34: 
                     35: #include <rexx/storage.h>
                     36: #include <rexx/errors.h>
                     37: 
                     38: /* this prevent a conflict between <rexx/rexxio.h> and <sys/dirent.h> */
                     39: #undef DT_DIR 
                     40: 
                     41: /****************************************************************************/
                     42: 
                     43: #include "sysconfig.h"
                     44: #include "sysdeps.h"
                     45: #include "uae.h"
                     46: #include "config.h"
                     47: #include "options.h"
                     48: #ifdef __GNUC__
                     49: #include "../include/memory.h" /* or else gcc includes machdep/memory.h */
1.1.1.2 ! root       50: #else
        !            51: #include "/include/memory.h"
1.1       root       52: #endif
1.1.1.2 ! root       53: #include "events.h"
1.1       root       54: #include "custom.h"
                     55: #include "readcpu.h"
                     56: #include "newcpu.h"
                     57: #include "disk.h"
                     58: #include "gui.h"
                     59: #include "sound.h"
                     60: #include "gensound.h"
                     61: #include "uaeexe.h"
                     62: #include "threaddep/penguin.h"
                     63: #include "xwin.h"
                     64: 
                     65: #include <ctype.h>
                     66: 
                     67: /****************************************************************************/
                     68: 
                     69: #define UAE_PORTNAME    "UAE"
                     70: #define RESULT_LEN      1024
                     71: #define PORT_LEN        80
                     72: #define CMD_LEN         1024
                     73: 
                     74: typedef struct
                     75: {
                     76:     char port[PORT_LEN];
                     77:     char cmd_on[CMD_LEN];
                     78:     char cmd_off[CMD_LEN];
                     79: } gui_rexx_s;
                     80: 
                     81: enum {LED_POW, LED_DF0, LED_DF1, LED_DF2, LED_DF3,
                     82:       NAME_DF0, NAME_DF1, NAME_DF2, NAME_DF3,
                     83:       ON_EXIT,
                     84:       GUI_REXX_MAX};
                     85: 
                     86: /****************************************************************************/
                     87: 
                     88: int  rexx_init(void);
                     89: void rexx_exit(void);
                     90: void rexx_led(int led, int on);
                     91: void rexx_filename(int num, char *name);
                     92: void rexx_handle_events(void);
1.1.1.2 ! root       93: int do_inhibit_frame(int); /* from ami-win.c */
1.1       root       94: 
                     95: /****************************************************************************/
                     96: 
                     97: #ifdef __GNUC__
                     98: struct RxsLib
                     99: #else
                    100: struct Library
                    101: #endif
                    102:                         *RexxSysBase;
                    103: static struct MsgPort   *ARexxPort;
                    104: static gui_rexx_s        gui_rexx[GUI_REXX_MAX];
                    105: static char              RESULT[RESULT_LEN];
                    106: static int               led_state[5];
                    107: 
                    108: static int   ADDRESS(char *hostname, char *cmd);
                    109: static int   matchstr(char **line,char *pat);
                    110: static void  extractstr(char **line, char *result, int len);
                    111: static int   matchnum(char **line);
                    112: 
                    113: /****************************************************************************/
                    114: 
                    115: extern int quit_program;                                 /* ami-gui.c */
1.1.1.2 ! root      116: extern ULONG frame_num;                                  /* ami-win.c */
1.1       root      117: extern void activate_debugger(void);                     /* debug.c */
                    118: extern char *to_unix_path(char *s);                      /* ami-disk.c */
                    119: extern char *from_unix_path(char *s);                    /* ami-disk.c */
                    120: 
                    121: /****************************************************************************/
                    122: 
                    123: int rexx_init(void)
                    124: {
                    125:     quit_program = 0;
                    126:     RexxSysBase = (void*)OpenLibrary("rexxsyslib.library",0L);
                    127:     if(!RexxSysBase) {
                    128:         fprintf(stderr, "Can't find rexxsyslib.library!\n");
                    129:         return 1;
                    130:     }
                    131:     if(FindPort(UAE_PORTNAME)) {
                    132:         fprintf(stderr, "Port \"%s\" already exists!\n",UAE_PORTNAME);
                    133:         return 1;    
                    134:     }
                    135:     ARexxPort = CreatePort(UAE_PORTNAME,0);
                    136:     if(!ARexxPort) {
                    137:         fprintf(stderr, "Failed to open AREXX port \"%s\"!\n",UAE_PORTNAME);
                    138:         return 1;
                    139:     }
                    140:     fprintf(stderr,"Rexx port \"%s\" installed.\n", UAE_PORTNAME);
                    141:     rexx_handle_events();
                    142:     return 0;
                    143: }
                    144: 
                    145: /****************************************************************************/
                    146: 
                    147: void rexx_exit(void)
                    148: {
                    149:     if(ARexxPort) {
                    150:         struct RexxMsg *msg;
                    151:         gui_rexx_s *gui = &gui_rexx[ON_EXIT];
                    152: 
                    153:         if(gui->port[0] && gui->cmd_on[0]) {
                    154:             if(ADDRESS(gui->port, gui->cmd_on) != RC_OK) {
                    155:                 fprintf(stderr,"%s:%s:%s\n", gui->port,
                    156:                                              gui->cmd_on,
                    157:                                              RESULT);
                    158:             }
                    159:             gui->port[0] = '\0';
                    160:          }
                    161:         Forbid();
                    162:         while((msg = (struct RexxMsg*)GetMsg(ARexxPort))) {
                    163:            msg->rm_Result1 = RC_ERROR;
                    164:            msg->rm_Result2 = NULL;
                    165:            ReplyMsg((void*)msg);
                    166:         }
                    167:         DeletePort(ARexxPort);
                    168:         Permit();
                    169:         ARexxPort = NULL;
                    170:     }
                    171:     if(RexxSysBase) {
                    172:         CloseLibrary((void*)RexxSysBase);
                    173:         RexxSysBase = NULL;
                    174:     }
                    175: }
                    176: 
                    177: /****************************************************************************/
                    178: 
                    179: static int EJECT(char *line)
                    180: {
                    181:     int drive = matchnum(&line);
                    182:     if(drive<0 || drive>3) return RC_WARN;
                    183:     disk_eject(drive);
                    184:     sprintf(RESULT,"Drive %d ejected",drive);
                    185:     return RC_OK;
                    186: }
                    187: 
                    188: /****************************************************************************/
                    189: 
                    190: static int INSERT(char *line)
                    191: {
                    192:     int drive = matchnum(&line);
                    193:     if(drive<0 || drive>3) return RC_WARN;
                    194:     if(disk_empty(drive)) {
                    195:         char buff[256];
                    196:         char *name;
                    197:         extractstr(&line, buff, 256);
                    198:         name = to_unix_path(buff);
                    199:         disk_insert(drive, name);
                    200:         free(name);
                    201:     } else {
                    202:         sprintf(RESULT,"Drive %d not empty!",drive);
                    203:         return RC_WARN;
                    204:     }
                    205:     return RC_OK;
                    206: }
                    207: 
                    208: /****************************************************************************/
                    209: 
                    210: static void QUIT(void)
                    211: {
                    212:     broken_in = 1;
                    213:     regs.spcflags |= SPCFLAG_BRK;
                    214:     quit_program = 1;
                    215: }
                    216: 
                    217: /****************************************************************************/
                    218: 
                    219: static int QUERY(char *line)
                    220: {
                    221:     char *res = NULL;
                    222:     int   alc = 0;
                    223: 
                    224:     if     (matchstr(&line, "LED_POW"))  res = led_state[0]?"1":"0";
                    225:     else if(matchstr(&line, "LED_DF0"))  res = led_state[1]?"1":"0";
                    226:     else if(matchstr(&line, "LED_DF1"))  res = led_state[2]?"1":"0";
                    227:     else if(matchstr(&line, "LED_DF2"))  res = led_state[3]?"1":"0";
                    228:     else if(matchstr(&line, "LED_DF3"))  res = led_state[4]?"1":"0";
                    229:     else if(matchstr(&line, "NAME_DF0")) res = from_unix_path(currprefs.df[0]), alc = 1;
                    230:     else if(matchstr(&line, "NAME_DF1")) res = from_unix_path(currprefs.df[1]), alc = 1;
                    231:     else if(matchstr(&line, "NAME_DF2")) res = from_unix_path(currprefs.df[2]), alc = 1;
                    232:     else if(matchstr(&line, "NAME_DF3")) res = from_unix_path(currprefs.df[3]), alc = 1;
                    233:     else if(matchstr(&line, "FAKEJOYSTICK")) res = currprefs.fake_joystick?"1":"0";
                    234:     else if(matchstr(&line, "DISPLAY"))  res = inhibit_frame?"0":"1";
                    235:     else if(matchstr(&line, "FRAMERATE")) {
                    236:         sprintf(RESULT,"%d",currprefs.framerate);
                    237:         return RC_OK;
1.1.1.2 ! root      238:     } else if(matchstr(&line, "FRAMENUM")) {
        !           239:         sprintf(RESULT,"%u",frame_num);
        !           240:         return RC_OK;
1.1       root      241:     } else if(matchstr(&line, "SOUND")) {
                    242:         sprintf(RESULT,"%d",sound_available?currprefs.produce_sound:-1);
                    243:         return RC_OK;
                    244:     } 
                    245:     else return RC_ERROR;
                    246: 
                    247:     if(res) {
                    248:         strncpy(RESULT, res, RESULT_LEN);
                    249:         if(alc) free(res);
                    250:     }
                    251:     return RC_OK;
                    252: }
                    253: 
                    254: /****************************************************************************/
                    255: 
                    256: static int FEEDBACK(char *line)
                    257: {
                    258:     gui_rexx_s *gui = NULL;
                    259: 
                    260:     if     (matchstr(&line,"LED_POW"))  gui = &gui_rexx[LED_POW];
                    261:     else if(matchstr(&line,"LED_DF0"))  gui = &gui_rexx[LED_DF0];
                    262:     else if(matchstr(&line,"LED_DF1"))  gui = &gui_rexx[LED_DF1];
                    263:     else if(matchstr(&line,"LED_DF2"))  gui = &gui_rexx[LED_DF2];
                    264:     else if(matchstr(&line,"LED_DF3"))  gui = &gui_rexx[LED_DF3];
                    265:     else if(matchstr(&line,"NAME_DF0")) gui = &gui_rexx[NAME_DF0];
                    266:     else if(matchstr(&line,"NAME_DF1")) gui = &gui_rexx[NAME_DF1];
                    267:     else if(matchstr(&line,"NAME_DF2")) gui = &gui_rexx[NAME_DF2];
                    268:     else if(matchstr(&line,"NAME_DF3")) gui = &gui_rexx[NAME_DF3];
                    269:     else if(matchstr(&line,"ON_EXIT"))  gui = &gui_rexx[ON_EXIT];
                    270:     else return RC_ERROR;
                    271: 
                    272:     while(1) {
                    273:         if(matchstr(&line, "ADDRESS") ||
                    274:            matchstr(&line, "PORT")) {
                    275:             extractstr(&line, gui->port, PORT_LEN);
                    276:         } else if(matchstr(&line,"COMMAND") ||
                    277:                   matchstr(&line,"CMD") ||
                    278:                   matchstr(&line,"CMD_ON")) {
                    279:             extractstr(&line, gui->cmd_on,  CMD_LEN);
                    280:         } else if(matchstr(&line,"CMD_OFF")) {
                    281:             extractstr(&line, gui->cmd_off, CMD_LEN);
                    282:         } else break;
                    283:     }
                    284:     return RC_OK;
                    285: }
                    286: 
                    287: /****************************************************************************/
                    288: 
                    289: static int VERSION(char *line)
                    290: {
                    291:     if(matchstr(&line,"STRING")) {
1.1.1.2 ! root      292:          sprintf(RESULT,
        !           293:                  "UAE-%d.%d.%d (%s%s%s) � by Bernd Schmidt & contributors, "
        !           294: #ifdef POWERUP
        !           295:                  "Amiga Port by Samuel Devulder & Holger Jakob (PPC extensions).",
        !           296: #else
        !           297:                  "Amiga Port by Samuel Devulder.",
        !           298: #endif
        !           299:                  UAEMAJOR, UAEMINOR, UAESUBREV,
        !           300:                  currprefs.cpu_level==0?"68000":
        !           301:                  currprefs.cpu_level==1?"68010":
        !           302:                  currprefs.cpu_level==2?"68020":"68020/68881",
        !           303:                  currprefs.address_space_24?" 24bits":"",
        !           304:                  currprefs.cpu_compatible?" compat":"");
1.1       root      305:     } else if(matchstr(&line,"NUM")) {
1.1.1.2 ! root      306:         sprintf(RESULT,"%d",UAEMAJOR*10000+UAEMINOR*100+UAESUBREV);
1.1       root      307:     } else if(matchstr(&line,"AUTHOR")) {
                    308:         sprintf(RESULT,"� by Bernd Schmidt & contributors");
                    309:     } else if(matchstr(&line,"PORT")) {
1.1.1.2 ! root      310: #ifdef POWERUP
        !           311:        sprintf(RESULT,"Amiga Port by Samuel Devulder & Holger Jakob (PPC extensions)");
        !           312: #else
1.1       root      313:         sprintf(RESULT,"Amiga Port by Samuel Devulder");
1.1.1.2 ! root      314: #endif
1.1       root      315:     } else return RC_ERROR;
                    316:     return RC_OK;
                    317: }
                    318: 
                    319: /****************************************************************************/
                    320: 
                    321: static int FRAMERATE(char *line)
                    322: {
                    323:     int num;
                    324:     num = matchnum(&line);
                    325:     if(num>=1 && num<=20) {
1.1.1.2 ! root      326:         changed_prefs.framerate = num;
1.1       root      327:     } else {
                    328:         sprintf(RESULT,"Invalid frame rate: %d\n", num);
                    329:         return RC_WARN;
                    330:     }
                    331:     return RC_OK;
                    332: }
                    333: 
                    334: /****************************************************************************/
                    335: 
                    336: static int FAKEJOYSTICK(char *line)
                    337: {
1.1.1.2 ! root      338:     if     (matchstr(&line,"ON"))     changed_prefs.fake_joystick = 2;
        !           339:     else if(matchstr(&line,"OFF"))    changed_prefs.fake_joystick = 0;
        !           340:     else if(matchstr(&line,"TOGGLE")) changed_prefs.fake_joystick =
1.1       root      341:                                       currprefs.fake_joystick?0:2;
                    342:     else return RC_ERROR;
                    343:     return RC_OK;
                    344: }
                    345: 
                    346: /****************************************************************************/
                    347: 
                    348: static int DISPLAY(char *line)
                    349: {
1.1.1.2 ! root      350:     if     (matchstr(&line,"ON"))     do_inhibit_frame(0);
        !           351:     else if(matchstr(&line,"OFF"))    do_inhibit_frame(1);
        !           352:     else if(matchstr(&line,"TOGGLE")) do_inhibit_frame(inhibit_frame?0:1);
1.1       root      353:     else return RC_ERROR;
                    354:     return RC_OK;
                    355: }
                    356: 
                    357: /****************************************************************************/
                    358: 
                    359: static int SOUND(char *line)
                    360: {
                    361:     if(!sound_available) {
                    362:         sprintf(RESULT,"Sound not available!");
                    363:         return RC_WARN;
                    364:     }
                    365: 
                    366:     if     (matchstr(&line,"ON"))     currprefs.produce_sound = 2;
                    367:     else if(matchstr(&line,"OFF"))    currprefs.produce_sound = 1;
                    368:     else if(matchstr(&line,"BEST"))   currprefs.produce_sound = 3;
                    369:     else if(matchstr(&line,"TOGGLE")) currprefs.produce_sound =
                    370:                                       currprefs.produce_sound<=1?2:1;
                    371:     else return RC_ERROR;
1.1.1.2 ! root      372: 
        !           373:     /* sam: the next 2 lines is a hack and I don't like it */
        !           374: /*    eventtab[ev_sample].active = (changed_prefs.produce_sound>=2)?1:0; 
        !           375:     events_schedule ();
        !           376: */
1.1       root      377:     return RC_OK;
                    378: }
                    379: 
                    380: /****************************************************************************/
                    381: 
                    382: static int UAEEXE(char *line)
                    383: {
                    384:     if(uaeexe(line)) {
                    385:         sprintf(RESULT,"Remote CLI failed!");
                    386:         return RC_WARN;
                    387:     }
                    388:     return RC_OK;
                    389: }
                    390: 
                    391: /****************************************************************************/
                    392: 
                    393: static int process_cmd(char *line)
                    394: {
                    395:     RESULT[0] = '\0';
                    396:     if     (matchstr(&line, "EJECT"))        return EJECT(line);
                    397:     else if(matchstr(&line, "INSERT"))       return INSERT(line);
                    398:     else if(matchstr(&line, "QUERY"))        return QUERY(line);
                    399:     else if(matchstr(&line, "FEEDBACK"))     return FEEDBACK(line);
                    400:     else if(matchstr(&line, "VERSION"))      return VERSION(line);
                    401:     else if(matchstr(&line, "BYE"))          QUIT();
                    402:     else if(matchstr(&line, "QUIT"))         QUIT();
                    403:     else if(matchstr(&line, "DEBUG"))        activate_debugger();
                    404:     else if(matchstr(&line, "RESET"))        m68k_reset();
                    405:     else if(matchstr(&line, "DISPLAY"))      return DISPLAY(line);
                    406:     else if(matchstr(&line, "FRAMERATE"))    return FRAMERATE(line);
                    407:     else if(matchstr(&line, "FAKEJOYSTICK")) return FAKEJOYSTICK(line);
                    408:     else if(matchstr(&line, "SOUND"))        return SOUND(line);
                    409:     else if(matchstr(&line, "UAEEXE"))       return UAEEXE(line);
                    410:     else return RC_ERROR;
                    411:     return RC_OK;
                    412: }
                    413: 
                    414: /****************************************************************************/
                    415: 
                    416: void rexx_handle_events(void)
                    417: {
                    418:     struct RexxMsg *msg;
                    419:     while((msg = (struct RexxMsg*)GetMsg(ARexxPort))) {
                    420:         if(!(msg->rm_Action & RXCOMM)) {
                    421:             fprintf(stderr,"Unknown action '%08X' recieved!\n",
                    422:                     msg->rm_Action);
                    423:             continue;
                    424:         }
                    425:         msg->rm_Result1 = process_cmd(msg->rm_Args[0]);
                    426:         msg->rm_Result2 = NULL;
                    427:         if(msg->rm_Action & RXFF_RESULT) {
1.1.1.2 ! root      428:             int len=strlen(RESULT); /* holger: trick for powerup */
        !           429:             msg->rm_Result2 = (LONG)CreateArgstring(RESULT,len);
1.1       root      430:         }
                    431:         ReplyMsg((void*)msg);
                    432:     }
                    433: }
                    434: 
                    435: /****************************************************************************/
                    436: 
                    437: void rexx_led(int led, int on)
                    438: {
                    439:     gui_rexx_s *gui = NULL;
                    440: 
                    441:     if(led < 0 || led > 4) return;
                    442:     led_state[led] = on;
                    443: 
                    444:     if(led == 0) gui = &gui_rexx[LED_POW];
                    445:     if(led == 1) gui = &gui_rexx[LED_DF0];
                    446:     if(led == 2) gui = &gui_rexx[LED_DF1];
                    447:     if(led == 3) gui = &gui_rexx[LED_DF2];
                    448:     if(led == 4) gui = &gui_rexx[LED_DF3];
                    449: 
                    450:     if(gui->port[0] && gui->cmd_on[0] && gui->cmd_off[0]) {
                    451:         if(ADDRESS(gui->port, on ? gui->cmd_on : gui->cmd_off) != RC_OK) {
                    452:             fprintf(stderr,"%s:%s:%s\n", gui->port,
                    453:                                          on ? gui->cmd_on : gui->cmd_off,
                    454:                                          RESULT);
                    455:         }
                    456:     }
                    457: }
                    458: 
                    459: /****************************************************************************/
                    460: 
                    461: void rexx_filename(int num, char *filename)
                    462: {
                    463:     gui_rexx_s *gui = NULL;
                    464:     if(num < 0 || num > 3) return;
                    465:     gui = &gui_rexx[NAME_DF0 + num];
                    466:     if(gui->port[0] && gui->cmd_on[0]) {
                    467:         char buf[CMD_LEN];
                    468:         if(!(filename = from_unix_path(filename))) return;
                    469:         sprintf(buf, gui->cmd_on, filename);
                    470:         free(filename);
                    471:         if(ADDRESS(gui->port, buf) != RC_OK) {
                    472:             fprintf(stderr,"%s:%s:%s\n", gui->port, buf, RESULT);
                    473:         }
                    474:     }
                    475: }
                    476: 
                    477: /****************************************************************************/
                    478: /* send a message to an AREXX port.
                    479:  */
                    480: static int ADDRESS(char *hostname, char *cmd)
                    481: {
                    482:     struct MsgPort *RexxPort,
                    483:                    *ReplyPort;
                    484:     struct RexxMsg *HostMsg,
                    485:                    *answer;
                    486:     int result = RC_WARN;
                    487: 
                    488:     if(!stricmp(hostname, "COMMAND")) {
                    489:         return SystemTagList(cmd,NULL);
                    490:     }
                    491: 
                    492:     if((RexxPort = (void *)FindPort(hostname))) {
                    493:         if((ReplyPort = (void *)CreateMsgPort())) {
                    494:             if((HostMsg = CreateRexxMsg(ReplyPort, NULL, hostname))) {
1.1.1.2 ! root      495:                 int len=strlen(cmd); /* holger: trick for powerup */
        !           496:                 if((HostMsg->rm_Args[0] = CreateArgstring(cmd,len))) {
1.1       root      497:                     HostMsg->rm_Action  = RXCOMM | RXFF_RESULT;
                    498:                     PutMsg(RexxPort, (void*)HostMsg);
                    499:                     WaitPort(ReplyPort);
                    500:                     while(!(answer = (void *)GetMsg(ReplyPort)));
                    501:                     result = answer->rm_Result1;
                    502:                     if(result == RC_OK) {
                    503:                         if(answer->rm_Result2) {
                    504:                         strncpy(RESULT,(char *)answer->rm_Result2,RESULT_LEN);
                    505:                         DeleteArgstring((char *)answer->rm_Result2);
                    506:                         } else RESULT[0] = '\0';
                    507:                     }
                    508:                     DeleteArgstring(HostMsg->rm_Args[0]);
                    509:                 } else strcpy(RESULT, "Can't create argstring!");
                    510:                 DeleteRexxMsg(HostMsg);
                    511:             } else strcpy(RESULT, "Can't create rexx message!");
                    512:             DeleteMsgPort(ReplyPort);
                    513:         } else strcpy(RESULT, "Can't alloc reply port!");
                    514:     } else sprintf(RESULT, "Port \"%s\" not found!",hostname);
                    515:     return result;
                    516: }
                    517: 
                    518: /****************************************************************************/
                    519: /* argument parsing routines
                    520:  */
                    521: static int matchstr(char **line,char *pat)
                    522: {
                    523:     char *s = *line;
                    524:     char match = 0;
                    525:     while(isspace(*s)) ++s;
                    526:     if(*s=='\"' || *s== '\'') match = *s++;
                    527:     while(*s && (tolower(*s)==tolower(*pat)) && (!match || *s!=match)) {++s;++pat;}
                    528:     if(match && *s==match && s[1]) ++s;
                    529:     if(!*pat && (!*s || isspace(*s))) {
                    530:         while(isspace(*s)) ++s;
                    531:         *line = s;
                    532:         return 1;
                    533:     }
                    534:     return 0;
                    535: }
                    536: 
                    537: /****************************************************************************/
                    538: 
                    539: static void extractstr(char **line, char *result, int len)
                    540: {
                    541:     char *s    = *line;
                    542:     char match = 0;
                    543: 
                    544:     while(isspace(*s)) ++s;
                    545: 
                    546:     if(*s=='\"' || *s=='\'') match = *s++;
                    547:     while(*s && *s != match) {
                    548:         if(*s == '\\' && (s[1] == '\'' || s[1] == '\"')) ++s;
                    549:         if(len > 1) {*result++ = *s;--len;}
                    550:         ++s;
                    551:         if(!match && isspace(*s)) break;
                    552:     }
                    553:     if(match && *s == match) ++s;
                    554:     while(isspace(*s)) ++s;
                    555: 
                    556:     *result  = '\0';
                    557:     *line    = s;
                    558: }
                    559: 
                    560: /****************************************************************************/
                    561: 
                    562: static int matchnum(char **line)
                    563: {
                    564:     char *s = *line, match = 0;
                    565:     int sign = 1, num = 0;
                    566: 
                    567:     while(isspace(*s)) ++s;
                    568:     if(*s=='\"' || *s=='\'') match = *s++;
                    569:     if(*s=='-') {sign = -1;++s;}
                    570:     if(*s=='+') ++s;
                    571:     while(isspace(*s)) ++s;
                    572:     while(*s>='0' && *s<='9') num = num*10 + (*s++ - '0');
                    573:     if(match && *s==match && s[1]) ++s;
                    574:     while(isspace(*s)) ++s;
                    575:     *line = s;
                    576:     return sign>0?num:-num;
                    577: }
1.1.1.2 ! root      578: 
        !           579: /****************************************************************************/
        !           580: 
        !           581: #ifdef POWERUP
        !           582: /* sam: those function should be in the ppc version of the unexisting 
        !           583:         libamiga.a */
        !           584: #define NEWLIST(l) ((l)->lh_Head = (struct Node *)&(l)->lh_Tail, \
        !           585:                     /*(l)->lh_Tail = NULL,*/ \
        !           586:                     (l)->lh_TailPred = (struct Node *)&(l)->lh_Head)
        !           587: struct MsgPort *CreatePort(STRPTR name,LONG pri)
        !           588: { struct MsgPort *port = NULL;
        !           589:   UBYTE portsig;
        !           590: 
        !           591:   if ((BYTE)(portsig=AllocSignal(-1)) >= 0)
        !           592:   { if (!(port=PPCAllocMem(sizeof(struct MsgPort),MEMF_CLEAR|MEMF_PUBLIC)))
        !           593:       FreeSignal(portsig);
        !           594:     else
        !           595:     {
        !           596:       port->mp_Node.ln_Type=NT_MSGPORT;
        !           597:       port->mp_Node.ln_Pri=pri;
        !           598:       port->mp_Node.ln_Name=name;
        !           599:       /* done via AllocMem
        !           600:       port->mp_Flags=PA_SIGNAL;
        !           601:       */
        !           602:       port->mp_SigBit=portsig;
        !           603:       port->mp_SigTask=FindTask(NULL);
        !           604:       NEWLIST(&port->mp_MsgList);
        !           605:       if (port->mp_Node.ln_Name)
        !           606:         AddPort(port);
        !           607:     }
        !           608:   }
        !           609:   return port;
        !           610: }
        !           611: 
        !           612: void DeletePort(struct MsgPort *port)
        !           613: { int i;
        !           614: 
        !           615:   if (port->mp_Node.ln_Name != NULL)
        !           616:     RemPort(port);
        !           617:   i=-1;
        !           618:   port->mp_Node.ln_Type=i;
        !           619:   port->mp_MsgList.lh_Head=(struct Node *)i;
        !           620:   FreeSignal(port->mp_SigBit);
        !           621:   PPCFreeMem(port,sizeof(struct MsgPort));
        !           622: }
        !           623: 
        !           624: struct IORequest *CreateExtIO(struct MsgPort *port,long iosize)
        !           625: {
        !           626:   struct IORequest *ioreq=NULL;
        !           627: 
        !           628:   if (port && (ioreq=PPCAllocMem(iosize,MEMF_CLEAR|MEMF_PUBLIC)))
        !           629:   {
        !           630:     ioreq->io_Message.mn_Node.ln_Type=NT_REPLYMSG;
        !           631:     ioreq->io_Message.mn_ReplyPort=port;
        !           632:     ioreq->io_Message.mn_Length=iosize;
        !           633:   }
        !           634:   return ioreq;
        !           635: }
        !           636: 
        !           637: struct IOStdReq *CreateStdIO(struct MsgPort *port)
        !           638: {
        !           639:   return (struct IOStdReq *)CreateExtIO(port,sizeof(struct IOStdReq));
        !           640: }
        !           641: 
        !           642: void DeleteExtIO(struct IORequest *ioreq)
        !           643: {
        !           644:   int i;
        !           645: 
        !           646:   i=-1;
        !           647:   ioreq->io_Message.mn_Node.ln_Type=i;
        !           648:   ioreq->io_Device=(struct Device *)i;
        !           649:   ioreq->io_Unit=(struct Unit *)i;
        !           650:   PPCFreeMem(ioreq,ioreq->io_Message.mn_Length);
        !           651: }
        !           652: 
        !           653: void DeleteStdIO(struct IORequest *ioreq) {DeleteExtIO(ioreq);}
        !           654: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.