DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T a

⟦3f2a27ce5⟧ TextFile

    Length: 3387 (0xd3b)
    Types: TextFile
    Names: »adldwim.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Adl/adlrun/adldwim.c« 

TextFile

#include <stdio.h>

#include "adltypes.h"
#include "adlprog.h"
#include "adlrun.h"


int16
dwimmer( rp, obj )
int16
    rp,
    obj;
{
    bp = sp = NUMVAR;			/* Trim the stack */
    push( 2 );				/* Push the stackdepth */
    push( obj );			/* Push the object */
    push( NUMVAR );			/* Push the bp */
    ip = 0;
    puship();				/* Push the ip */
    if( !(ip = routspace[ rp ]) ) {
	/* No dwimmer, so we fail. */
	bp = sp = NUMVAR;
	return 0;
    }
    runprog();				/* Run the dwimmer */
    return stack[ NUMVAR ];		/* Return the retval */
}


dwimerror( n )
int16
    n;
{
    switch( n ) {
	case 1 :
	    sayer( "You will have to be more specific.\n" );
	    break;
	case 2 :
	    sayer( "You don't see anything like that.\n" );
	    break;
    }
}


int16
dwimadj( which, adj )
int16
    which,
    adj;
{
    int16
	i, tsave;

    tsave = 0;
    for( i = 0; i < NUMOBJ; i++ ) {
	if( objspace[ i ].adj == adj ) {
	    if( dwimmer( which, i ) ) {
		if( tsave ) {
		    dwimerror( 1 );
		    return -1;
		}
		else
		    tsave = i;
	    }
	}
    }

    if( !tsave ) {
	dwimerror( 2 );
	return -1;
    }
    else
	return tsave;
}


int16
dwimnoun( which, noun )
int16
    which,
    noun;
{
    int16
	i, tsave;

    tsave = 0;
    for( i = nounspace[ noun ]; i != 0; i = objspace[ i ].others ) {
	if( dwimmer( which, i ) ) {
	    if( tsave ) {
		dwimerror( 1 );
		return -1;
	    }
	    else
		tsave = i;
	}
    }

    if( !tsave ) {
	dwimerror( 2 );
	return -1;
    }
    else
	return tsave;
}


dwimi()
{
    int16
	t;

    if( SET_EXIT( 0 ) != 0 )
	return -1;

    if( Inoun < 0 ) {
	/* Copy the string index */
	Iobj = Inoun;
	return 0;
    }
    if( (Inoun == 0) && (Imod == 0) )
	/* Preserve the old Iobj */
	return 0;
    if( Imod != 0 ) {
	/* The player typed a modifier */
	if( Inoun ) {
	    /* The player also typed a noun */
	    if( (Iobj = noun_exists( Imod, Inoun )) < 0 ) {
		/* Oops - no such mod-noun pair */
		dwimerror( 2 );
		return -1;
	    }
	}
	else {
	    /* The player typed no noun */
	    if( (Iobj = dwimadj( _DWIMI, Imod )) < 0 )
		/* Oops - the modifier wasn't sufficient */
		return -1;
	}
    }
    else {
	/* The player typed a noun, but no modifier */
	if( (t = noun_exists( 0, Inoun )) < 0 ) {
	    /* There is no unmodified object with noun Inoun */
	    if( (Iobj = dwimnoun( _DWIMI, Inoun )) < 0 )
		/* Oops - the noun wasn't sufficient */
		return -1;
	}
	else
	    /* Everything is fine. */
	    Iobj = t;
    }
    return 0;
}


dwimd()
{
    int16
	i, t;

    if( SET_EXIT( 0 ) != 0 )
	return -1;

    for( i = 0; i < NumDobj; i++ ) {
	if( Dnoun[ i ] < 0 ) {		/* User typed a string */
	    Dobj[ i ] = Dnoun[ i ];
	    continue;
	}
	if( Dmod[ i ] != 0 ) {
	    /* The player typed a modifier */
	    if( Dnoun[ i ] ) {
		/* The player typed a noun */
		if( (Dobj[ i ] = noun_exists( Dmod[ i ], Dnoun[ i ] )) < 0 ) {
		    /* No such mod-noun pair exists */
		    dwimerror( 2 );
		    return -1;
		}
	    }
	    else if( (Dobj[ i ] = dwimadj( _DWIMD, Dmod[ i ] )) < 0 ) {
		return -1;
	    }
	}
	else if( (t = noun_exists( 0, Dnoun[ i ] )) < 0 ) {
	    /* An object with noun Dnoun[ i ] and mod 0 doesn't exist */
	    if( (Dobj[ i ] = dwimnoun( _DWIMD, Dnoun[ i ] )) < 0 ) {
		return -1;
	    }
	}
	else
	    /* An object with noun Dnoun[ i ] and mod 0 DOES exist */
	    Dobj[ i ] = t;
    }
    return 0;
}

/*** EOF adldwim.c ***/