[M3devel] "target specific pragmas"?
Mika Nystrom
mika at async.caltech.edu
Sat Feb 16 00:51:43 CET 2008
Darko writes:
>I'm sticking to my view about lexical arbitrariness, but on that
>basis, I'd really like to see an alternate syntax for M3, one that
>looks almost exactly like C, but roughly keeps the existing statement
>form. I think it would make the language much more palatable to C
>programmers and the like and would remove what is a silly barrier to
>broader adaption. We could call the syntax 'Modula-C'.
This is getting a bit silly, and I apologize to everyone reading this
about wasting their time, but I just have to show you the following
file. It is a header file from the original sources of "sh"
(this copy is from 4.3 TAHOE UNIX, but of course the code is much
older than that).
After that, blok.c, an example of "Bournegol" in use.
So, you want the opposite, huh?
Mika
/* mac.h 4.3 87/10/26 */
#
/*
* UNIX shell
*
* S. R. Bourne
* Bell Telephone Laboratories
*
*/
#define LOCAL static
#define PROC extern
#define TYPE typedef
#define STRUCT TYPE struct
#define UNION TYPE union
#define REG register
#define IF if(
#define THEN ){
#define ELSE } else {
#define ELIF } else if (
#define FI ;}
#define BEGIN {
#define END }
#define SWITCH switch(
#define IN ){
#define ENDSW }
#define FOR for(
#define WHILE while(
#define DO ){
#define OD ;}
#define REP do{
#define PER }while(
#undef DONE
#define DONE );
#define LOOP for(;;){
#define POOL }
#define SKIP ;
#define DIV /
#define REM %
#define NEQ ^
#define ANDF &&
#define ORF ||
#define TRUE (-1)
#define FALSE 0
#define LOBYTE 0377
#define STRIP 0177
#define QUOTE 0200
#define EOF 0
#define NL '\n'
#define SP ' '
#define LQ '`'
#define RQ '\''
#define MINUS '-'
#define COLON ':'
#ifndef lint
static char sccsid[] = "@(#)blok.c 4.2 8/11/83";
#endif
#
/*
* UNIX shell
*
* S. R. Bourne
* Bell Telephone Laboratories
*
*/
#include "defs.h"
/*
* storage allocator
* (circular first fit strategy)
*/
#define BUSY 01
#define busy(x) (Rcheat((x)->word)&BUSY)
POS brkincr=BRKINCR;
BLKPTR blokp; /*current search pointer*/
BLKPTR bloktop=BLK(end); /*top of arena (last blok)*/
ADDRESS alloc(nbytes)
POS nbytes;
{
REG POS rbytes = round(nbytes+BYTESPERWORD,BYTESPERWORD);
LOOP INT c=0;
REG BLKPTR p = blokp;
REG BLKPTR q;
REP IF !busy(p)
THEN WHILE !busy(q = p->word) DO p->word = q->word OD
IF ADR(q)-ADR(p) >= rbytes
THEN blokp = BLK(ADR(p)+rbytes);
IF q > blokp
THEN blokp->word = p->word;
FI
p->word=BLK(Rcheat(blokp)|BUSY);
return(ADR(p+1));
FI
FI
q = p; p = BLK(Rcheat(p->word)&~BUSY);
PER p>q ORF (c++)==0 DONE
addblok(rbytes);
POOL
}
VOID addblok(reqd)
POS reqd;
{
IF stakbas!=staktop
THEN REG STKPTR rndstak;
REG BLKPTR blokstak;
pushstak(0);
rndstak=round(staktop,BYTESPERWORD);
blokstak=BLK(stakbas)-1;
blokstak->word=stakbsy; stakbsy=blokstak;
bloktop->word=BLK(Rcheat(rndstak)|BUSY);
bloktop=BLK(rndstak);
FI
reqd += brkincr; reqd &= ~(brkincr-1);
blokp=bloktop;
bloktop=bloktop->word=BLK(Rcheat(bloktop)+reqd);
bloktop->word=BLK(ADR(end)+1);
BEGIN
REG STKPTR stakadr=STK(bloktop+2);
staktop=movstr(stakbot,stakadr);
stakbas=stakbot=stakadr;
END
}
VOID free(ap)
BLKPTR ap;
{
REG BLKPTR p;
IF (p=ap) ANDF p<bloktop
THEN Lcheat((--p)->word) &= ~BUSY;
FI
}
#ifdef DEBUG
chkbptr(ptr)
BLKPTR ptr;
{
INT exf=0;
REG BLKPTR p = end;
REG BLKPTR q;
INT us=0, un=0;
LOOP
q = Rcheat(p->word)&~BUSY;
IF p==ptr THEN exf++ FI
IF q<end ORF q>bloktop THEN abort(3) FI
IF p==bloktop THEN break FI
IF busy(p)
THEN us += q-p;
ELSE un += q-p;
FI
IF p>=q THEN abort(4) FI
p=q;
POOL
IF exf==0 THEN abort(1) FI
prn(un); prc(SP); prn(us); prc(NL);
}
#endif
More information about the M3devel
mailing list