Patch title: Release 94 bulk changes
Abstract:
File: /pliant/language/os/glue.c
Key:
    Removed line
    Added line
// Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// version 2 along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

/*
abstract
  text "I've put here all the OS related glue stuff."
*/

#include <stdarg.h>

#ifdef _OS2_API_
  #define INCL_BASE
  #include <os2.h>
#endif

#ifdef _WIN32_API_
  #include <windows.h>
  #include <windef.h>
#endif

#if defined(_LINUX_API_) && defined(_GCC_)

  #include "linux_kernel.c"

  inline static _syscall3(int,open,const char *,file,int,flag,int,mode)
  inline static _syscall3(int,read,int,fd,char *,buf,size_t,count)
  inline static _syscall3(int,write,int,fd,const char *,buf,size_t,count)
  inline static _syscall1(int,close,int,fd)
  inline static _syscall2(int,stat,char *,filename,void *,buf)
  inline static _syscall3(int,execve,char *,filename,char **,argv,char **,env)
  // inline static _syscall1(int,personality,int,persona)

  #define __NR__mmap __NR_mmap
  inline static _syscall1(unsigned long,_mmap,unsigned long *,parameters)
  inline static void * mmap(void * addr, size_t len, int prot, int flags, int fd, size_t offset) {
    unsigned long buffer[6];
    buffer[0] = (unsigned long)addr;
    buffer[1] = (unsigned long)len;
    buffer[2] = (unsigned long)prot;
    buffer[3] = (unsigned long)flags;
    buffer[4] = (unsigned long)fd;
    buffer[5] = (unsigned long)offset;
    return (void *)_mmap(buffer); }
  inline static _syscall2(int,munmap,void *,addr,size_t,len)
  inline static _syscall3(int,mprotect,void *,addr,size_t,len,int,prot)

  #define __NR_exit1 __NR_mmap
  #define __NR_exit1 __NR_exit
  inline static _syscall1(int,exit1,int,exitcode)

#endif
#if defined(_LINUX_API_) && defined(_WATCOM_)

  #define O_RDONLY 00
  #define O_WRONLY 10
  #define O_RDWR   02
  #define O_CREAT  0100
  #define O_TRUNC  1000

  int open(const char *file,int flag,int mode);
  #pragma aux open =                 \
    "mov eax,5"                      \
    "int 0x80"                       \
    parm [ebx][ecx][edx]             \
    value [eax]                      \
    modify exact [eax];

  int read(int fd,char *buf,unsigned int count);
  #pragma aux read =                 \
    "mov eax,3"                      \
    "int 0x80"                       \
    parm [ebx][ecx][edx]             \
    value [eax]                      \
    modify exact [eax];

  int write(int fd,const char *buf,unsigned int count);
  #pragma aux write =                \
    "mov eax,4"                      \
    "int 0x80"                       \
    parm [ebx][ecx][edx]             \
    value [eax]                      \
    modify exact [eax];

  int close(int fd);
  #pragma aux close =                \
    "mov eax,6"                      \
    "int 0x80"                       \
    parm [ebx]                       \
    value [eax]                      \
    modify exact [eax];

  unsigned long _mmap(unsigned long *parameters);
  #pragma aux _mmap =                \
    "mov eax,90"                     \
    "int 0x80"                       \
    parm [ebx]                       \
    value [eax]                      \
    modify exact [eax];

  #define PROT_READ       1
  #define PROT_WRITE      2
  #define PROT_EXEC       4
  #define PROT_NONE       0

  #define MAP_SHARED      0x0001
  #define MAP_PRIVATE     0x0002
  #define MAP_FIXED       0x0010
  #define MAP_ANONYMOUS   0x0020
  #define MAP_GROWSDOWN   0x0100
  #define MAP_EXECUTABLE  0x1000

  static void * mmap(void * addr, unsigned int len, int prot, int flags, int fd, unsigned long offset) {
    unsigned long buffer[6];
    buffer[0] = (unsigned long)addr;
    buffer[1] = (unsigned long)len;
    buffer[2] = (unsigned long)prot;
    buffer[3] = (unsigned long)flags;
    buffer[4] = (unsigned long)fd;
    buffer[5] = (unsigned long)offset;
    return (void *)_mmap(buffer); }

  int munmap(void *addr,unsigned int len);
  #pragma aux munmap =               \
    "mov eax,91"                     \
    "int 0x80"                       \
    parm [ebx][ecx]                  \
    value [eax]                      \
    modify exact [eax];

  #define SIGCONT 18

  int exit1(int exitcode);
  #pragma aux exit1 =                \
    "mov eax,1"                      \
    "int 0x80"                       \
    parm [ebx]                       \
    value [eax]                      \
    modify exact [eax];

#endif