Metropoli BBS
VIEWER: fileexec.c MODE: TEXT (ASCII)
#include "pmc.h"

long __pascal fileexec (STR fnm, STR cline)
{
  REGSTRUCT rs;
  DWORD oldlowsize;
  STR nextstr = (STR)_lowbufptr + 22;
  int r;

  rs.w.FLAGS = rs.d.SSSP = 0;

  if (((DWORD)fnm + database) > 0xfffff)
  {
    nextstr = stpcpy (nextstr, fnm) + 1;
    fnm = (STR)_lowbufptr + 22;
  }

  strcpy (nextstr + 2, cline);
  r = strlen (cline);
  nextstr[0] = r + 1;
  nextstr[1] = ' ';
  nextstr[2 + r] = 0xd;
  cline = nextstr;

  ((WORD *)_lowbufptr)[0] = envseg;
  ((WORD *)_lowbufptr)[1] = (DWORD)cline + database & 15;
  ((WORD *)_lowbufptr)[2] = (DWORD)cline + database >> 4;
  ((WORD *)_lowbufptr)[3] = 0x5c;
  ((WORD *)_lowbufptr)[4] = pspseg;
  ((WORD *)_lowbufptr)[5] = 0x6c;
  ((WORD *)_lowbufptr)[6] = pspseg;

  oldlowsize = lowheapblock.size;
  mbsquish (&lowheapblock);

  rs.w.ES = pspseg;
  rs.w.BX = ((lowheapblock.base + lowheapblock.size + 15) - pspbase) >> 4;
  rs.b.AH = 0x4a;
  xlt_simrmint (0x21, &rs, 0);

  rs.w.ES = (DWORD)_lowbufptr + database >> 4;
  rs.w.BX = (DWORD)_lowbufptr + database & 15;
  rs.w.DS = (DWORD)fnm + database >> 4;
  rs.w.DX = (DWORD)fnm + database & 15;
  rs.w.AX = 0x4b00;
  r = xlt_simrmint (0x21, &rs, 0);

  if (!r && (rs.w.FLAGS & fCF))
    r = rs.d.EAX | 0xffff0000;

  mbunsquish (&lowheapblock, oldlowsize);

  rs.w.ES = pspseg;
  rs.w.BX = ((lowheapblock.base + lowheapblock.size + 15) - pspbase) >> 4;
  rs.b.AH = 0x4a;
  xlt_simrmint (0x21, &rs, 0);

  if (r < 0)
    return r;

  rs.b.AH = 0x4d;
  xlt_simrmint (0x21, &rs, 0);

  return rs.b.AL;
}

[ RETURN TO DIRECTORY ]