⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 func.c

📁 类PASCAL语言的编译器,LINUX环境的,我没试过是否正确.
💻 C
字号:
/******************************************************************** * * This is a small program that starts and stops another program. * The 'other program' is supposed to add functions to FPL at startup * with the given anchor, and is also supposed to remove them when * told to close down. * * This program can be made pure/re-entrant. * */#include <proto/exec.h>#include <proto/dos.h>#include <exec/execbase.h>#include <exec/ports.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "funclib.h"#define OURPORTNAME "FPLfunc"#define OTHERPORTNAME "FPLlib"#define VERSION 2 /* we say that this is the version 2 of the funclib */struct ReportMsg {  struct Message msg;  int ErrorNumber;};extern struct ExecBase *SysBase;void CloseOurPort(struct MsgPort *port){  if (port){    RemPort(port);    DeleteMsgPort(port);  }}FuncRet main(int argc, char *argv[]){  long open=FALSE;  long close=FALSE;  long version;  long anchor;  char ourportname[40];  char otherportname[40];  char systemline[80];  struct MsgPort *port;  struct MsgPort *otherport;  if(argc<3)    return(FUNCLIB_PARAMETER);  if(!strcmp("open", argv[1])) {    open = TRUE;    version = atoi(argv[3]);    if (version > VERSION)      /* the requested version is larger than this is, fail! */      return FUNCLIB_VERSION;  } else {    close = TRUE;  }  anchor = atoi(argv[2]);  sprintf(ourportname, "%s.%d", OURPORTNAME, anchor);  sprintf(otherportname, "%s.%d", OTHERPORTNAME, anchor);  /* Make our port, so that the funclib can find us */  if (port=CreateMsgPort()){    port->mp_Node.ln_Name=ourportname;    port->mp_Node.ln_Pri=0;    AddPort(port);  } else    return FUNCLIB_INTERNAL; /* We failed... */  if(open) {    /*     * Search for an already running funclib.     */    Forbid();    otherport = FindPort(otherportname);    Permit();    if (!otherport) {      /*       * Start the funclib program.       * We send it the 'version' and 'anchor' parameters as we know       * about.       */      sprintf(systemline,              "run >NIL: FPLLIBS:lib version %d anchor %d",              version,              anchor);      if(-1 != System(systemline, NULL) ) {        struct ReportMsg *Mymsg;        WaitPort(port);        Mymsg = (struct ReportMsg *) GetMsg(port);        if (!Mymsg->ErrorNumber) {          ReplyMsg((struct Message *) Mymsg);        } else {          /* We failed opening the funclib! */          CloseOurPort(port);          return Mymsg->ErrorNumber;        }      } else {        /* We failed opening the funclib! */        CloseOurPort(port);        return FUNCLIB_INTERNAL;      }    } else {      /* the funclib is already running! */      return FUNCLIB_OK;    }  } else {    /* We tell the funclib to close down! */    struct ReportMsg Closedown;    Closedown.msg.mn_ReplyPort=port;    Closedown.ErrorNumber=0;    Forbid(); /* Search for an already running funclib. */    if (otherport = FindPort(otherportname)) {      PutMsg(otherport,(struct Message *) &Closedown);      Permit();      /* Now let's wait for a reply */      WaitPort(port);      GetMsg(port) ;      if (Closedown.ErrorNumber) {        /* Somehow we failed to close */        CloseOurPort(port);        return Closedown.ErrorNumber;      }    } else {      /* there is no funclib to close! */      Permit();      return FUNCLIB_OK;    }  }  /*   * We close our port.   */  CloseOurPort(port);  return FUNCLIB_OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -