home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / compress / misc / xfh / source.lha / src / lib / DebugIO.c < prev    next >
C/C++ Source or Header  |  1993-02-28  |  4KB  |  144 lines

  1. /* Rutines to send debug-info to the debug-handler. */
  2.  
  3. #include <exec/types.h>
  4. #include <exec/memory.h>
  5. #include <exec/ports.h>
  6.  
  7. #include <proto/exec.h>
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <stdarg.h>
  12.  
  13. #include <DebugPrc.h>
  14.  
  15.  
  16. void opendebug(void){
  17.    struct debugmsg *openmsg;
  18.    int len;
  19.    struct MsgPort *port;
  20.    
  21.    len=strlen(OPENCMD)+1;
  22.    if(openmsg=AllocMem(len+=sizeof(struct Message),MEMF_PUBLIC)){
  23.       openmsg->msg.mn_Node.ln_Succ=NULL;
  24.       openmsg->msg.mn_Node.ln_Pred=NULL;
  25.       openmsg->msg.mn_Node.ln_Type=NT_MESSAGE;
  26.       openmsg->msg.mn_Node.ln_Pri=0;
  27.       openmsg->msg.mn_Node.ln_Name=openmsg->string;
  28.       openmsg->msg.mn_ReplyPort=NULL;
  29.       openmsg->msg.mn_Length=len;
  30.       strcpy(openmsg->string,OPENCMD);
  31.       Forbid();
  32.       if(port=FindPort(PORTNAME)){
  33.          PutMsg(port,openmsg);
  34.          Permit();
  35.       }else{
  36.          Permit();
  37.          FreeMem(openmsg,len);
  38.       }
  39.    }
  40. }
  41.  
  42. void closedebug(void){
  43.    struct debugmsg *closemsg;
  44.    int len;
  45.    struct MsgPort *port;
  46.    
  47.    port=FindPort(PORTNAME);
  48.    if(port){
  49.       len=strlen(CLOSECMD)+1;
  50.       if(closemsg=AllocMem(len+=sizeof(struct Message),MEMF_PUBLIC)){
  51.          closemsg->msg.mn_Node.ln_Succ=NULL;
  52.          closemsg->msg.mn_Node.ln_Pred=NULL;
  53.          closemsg->msg.mn_Node.ln_Type=NT_MESSAGE;
  54.          closemsg->msg.mn_Node.ln_Pri=0;
  55.          closemsg->msg.mn_Node.ln_Name=closemsg->string;
  56.          closemsg->msg.mn_ReplyPort=NULL;
  57.          closemsg->msg.mn_Length=len;
  58.          strcpy(closemsg->string,CLOSECMD);
  59.          PutMsg(port,closemsg);
  60.       }
  61.    }
  62. }
  63.  
  64.  
  65. void __asm myputchar(register __d0 char ch,register __a3 char ** p){
  66.  
  67.   *(*p)++=ch;
  68. }
  69.  
  70. void myvsprintf(char *buf,char *format,va_list args){
  71.    char *pos=buf;
  72.    
  73.    RawDoFmt(format,(APTR)args,myputchar,&pos);
  74. }
  75.  
  76. /*
  77.  * rawdprintf uses RawDoFmt() for doing vsprintf() (Lattice vsprintf()
  78.  * breaks sometimes when called from certain non-process environments.
  79.  * Because of this, things like rawdprintf("%*s",5,"Hello123") are not
  80.  * supported.
  81.  */
  82.  
  83. void rawdprintf(char *format,...){
  84.    char buf[256];
  85.    va_list vl;
  86.    int len;
  87.    struct debugmsg *msg;
  88.    struct MsgPort *port;
  89.    
  90.    va_start(vl,format);
  91.    port=FindPort(PORTNAME);
  92.    if(port){
  93.       myvsprintf(buf,format,vl);
  94.       len=strlen(buf)+1;
  95.       if(msg=AllocMem(len+=sizeof(struct Message),MEMF_PUBLIC)){
  96.          msg->msg.mn_Node.ln_Succ=NULL;
  97.          msg->msg.mn_Node.ln_Pred=NULL;
  98.          msg->msg.mn_Node.ln_Type=NT_MESSAGE;
  99.          msg->msg.mn_Node.ln_Pri=0;
  100.          msg->msg.mn_Node.ln_Name=msg->string;
  101.          msg->msg.mn_ReplyPort=NULL;
  102.          msg->msg.mn_Length=len;
  103.          strcpy(msg->string,buf);
  104.          PutMsg(port,msg);
  105.       }
  106.    }
  107.    va_end(vl);
  108. }
  109.  
  110.  
  111. /*
  112.  * dprintf() uses the standard c vsprintf(), so it is more flexible than
  113.  * rawdprintf(), but seems to cause troubles in non-standard contexts.
  114.  */
  115.  
  116. void dprintf(char *format,...){
  117.    char buf[256];
  118.    va_list vl;
  119.    int len;
  120.    struct debugmsg *msg;
  121.    struct MsgPort *port;
  122.    
  123.    va_start(vl,format);
  124.    port=FindPort(PORTNAME);
  125.    if(port){
  126.       vsprintf(buf,format,vl);
  127.       /* Could derive from vsprintf's return, but this is sure to be safe */
  128.       len=strlen(buf)+1;
  129.       if(msg=AllocMem(len+=sizeof(struct Message),MEMF_PUBLIC)){
  130.          msg->msg.mn_Node.ln_Succ=NULL;
  131.          msg->msg.mn_Node.ln_Pred=NULL;
  132.          msg->msg.mn_Node.ln_Type=NT_MESSAGE;
  133.          msg->msg.mn_Node.ln_Pri=0;
  134.          msg->msg.mn_Node.ln_Name=msg->string;
  135.          msg->msg.mn_ReplyPort=NULL;
  136.          msg->msg.mn_Length=len;
  137.          strcpy(msg->string,buf);
  138.          PutMsg(port,msg);
  139.       }
  140.    }
  141.    va_end(vl);
  142. }
  143.  
  144.