[BACK]Return to oxserver.m2 CVS log [TXT][DIR] Up to [local] / OpenXM / src / Macaulay2 / m2

File: [local] / OpenXM / src / Macaulay2 / m2 / oxserver.m2 (download)

Revision 1.1, Thu Sep 21 09:20:53 2000 UTC (23 years, 7 months ago) by takayama
Branch: MAIN
CVS Tags: maekawa-ipv6, R_1_3_1-2, RELEASE_1_3_1_13b, RELEASE_1_2_3_12, RELEASE_1_2_3, RELEASE_1_2_2_KNOPPIX_b, RELEASE_1_2_2_KNOPPIX, RELEASE_1_2_2, RELEASE_1_2_1, RELEASE_1_1_3, KNOPPIX_2006, HEAD, DEB_REL_1_2_3-9

The initial version. They are moved from rat/.
The tags are changed from ID to OpenXM.

--$OpenXM: OpenXM/src/Macaulay2/m2/oxserver.m2,v 1.1 2000/09/21 09:20:53 takayama Exp $
-- server commands
--ox'server'send := (OXSERVER, String) -> (...);
  -- This sends a sequence of bytes to the client.
  -- Note: a shutdown command is never received.

-- Implementation of the OX stack machine, using OX_COMMAND:


OX'commands = new MutableHashTable;

-- Local data for this stack machine.
ox'init'sm = () -> (
    ox'stack = new MutableList from splice {200:null};
    ox'sp = 0;  -- Number of elements currently contained.
    );

ox'view = () -> (
     if ox'sp === 0 then (stderr << "stack empty" << endl;)
     else
         scan(ox'sp, i -> (stderr << "at " << i << " have " << ox'stack#i << endl;)))

ox'popObject = (packetNum) -> (
     if ox'sp === 0 then 
         ox'error(packetNum,"stack underflow")
     else (
	  ox'sp = ox'sp-1;
	  val := ox'stack#ox'sp;
	  ox'stack#ox'sp = null;
	  val))

ox'pop = (packetNum,typ) -> (
     val := ox'popObject packetNum;
     if class val =!= typ then 
         ox'error(packetNum,"incorrect type on stack");
     val)

ox'push = (val) -> (
     if ox'sp > #ox'stack then (
	  -- increase the size of the stack
	  newstack := new MutableList from splice{2 * #ox'stack : null};
	  scan(#ox'stack, i -> newstack#i = ox'stack#i);
	  ox'stack = newstack;
	  );
     ox'stack#ox'sp = val;
     ox'sp = ox'sp + 1;
     )
	       
ox'error = (packetNum,s) -> ox'push ERROR{int32 packetNum,s}

OX'commands#SM'popCMO = (packetNum) -> (
     ox'popObject packetNum
     )

OX'commands#SM'popString = (packetNum) -> (
     v := ox'popObject packetNum;
     toString v
     )

OX'commands#SM'pops = (packetNum) -> (
     n := ox'stack#ox'sp;
     if n > ox'sp then n = ox'sp;
     scan(n, i -> ox'popObject packetNum))

OX'commands#SM'getsp = (packetNum) -> (
     -- Place the number of objects onto the stack.
     ox'push(INT32(ox'sp)))

OX'commands#SM'nop = (packetNum) -> null

OX'commands#SM'setName = (packetNum) -> (
     varname := ox'pop(packetNum,String);
     val := ox'popObject(packetNum);
     (value ("symbol " | varname)) <- val;
     )

OX'commands#SM'evalName = (packetNum) -> (
     varname := ox'pop(packetNum,String);
     val := value ("symbol " | varname);
     ox'push val;
     )

OX'commands#SM'executeStringByLocalParser = (packetNum) -> (
     str := ox'pop(packetNum,String);
     try (
        val := value str;
     	ox'push val;
     ) else
        ox'error(packetNum,"Error occured");
     )

OX'commands#SM'executeFunction = (packetNum) -> (
     fcn := ox'pop(PacketNum,String);
     n := ox'pop(PacketNum,INT32);
     n = n#0;
     args := toSequence apply(n, i -> ox'popObject(packetNum));
     try (
	  val := (value fcn)(args);
	  ox'push val;
     ) else
        ox'error(packetNum,"Error occured");
     )

OX'commands#SM'dupErrors = (packetNum) -> 
     ox'push select(ox'sp, i -> class i === ERROR)

OX'commands#SM'mathcap = (packetNum) -> (
     ox'push(MATHCAP'OF'M2'SERVER);
     )

OX'commands#SM'setMathCap = (packetNum) -> (
     val := ox'pop(packetNum,MATHCAP);
     -- BUG: we are ignoring the math cap!!
     )
-----------------
-- Server code --
-----------------

OXSERVER = new Type of MutableHashTable

ox'send'data = () -> (
     << OXDATA << toNetwork(ox'next'packet);
     ox'next'packet = ox'next'packet + 1;
     )

OXserver = () -> (
     -- initialize stack machine
     stderr << "entering OXserver" << endl << flush;
     ox'init'sm();
     ox'next'packet = 72;
     -- we use stdin, stdout as our two data connections
     -- handshake the network byte input and output
     << "\000\000" << flush;
     x := read stdio;  -- throw out the response.
     OX = makeOXINPUT stdio;
     stderr << "About to enter loop" << endl << flush;
     -- enter the read/eval/write loop
     while (true) do (
	  --readMoreData OX;
	  --if atEndOfFile(stdio) then (
	  --     stderr << "bye bye" << endl << flush;
	  --     return;);
	  typ := get32bits OX;
	  packetNum := get32bits OX;
	  if typ === OX'COMMAND then (
	      cmd := get32bits OX;
	      stderr << "Command = " << cmd << endl << flush;
	      val := OX'commands#cmd(packetNum);
	      stderr << "  Result = " << val << endl << flush;
	      if val =!= null then (
		   -- val is a CMO object
		   ox'send'data();
		   CMOSerialize(OX.F, val);
		   OX.F << flush;
		   );
	      )
	  else if typ === OX'DATA then (
	       v := CMOfromBinary OX;
	       stderr << "value = " << v << endl << flush;
	       ox'push(v)
	       )
	  else ox'error(packetNum, "expected OX_COMMAND or OX_DATA");
	  ox'view()
	  )
     )

///
restart
load "oxcommon.m2"
load "oxserver.m2"
ox'init'sm()
ox'push 3
ox'push 5
ox'push INT32 2
ox'push "binomial"
ox'view()
OX'commands#SM'executeFunction 32
ox'view()
ox'push INT32 12
OX'commands#SM'pops 33
ox'view()
ox'push "asdf = 1347"
OX'commands#SM'executeStringByLocalParser 34
ox'view()
ox'push "2*asdf"
OX'commands#SM'executeStringByLocalParser 34
ox'view()
///

OXserver()