home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
ipl
/
cfuncs
/
internal.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-07-29
|
2KB
|
80 lines
/*
############################################################################
#
# File: internal.c
#
# Subject: Functions to access Icon internals
#
# Author: Gregg M. Townsend
#
# Date: October 3, 1995
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# These functions provide some access to the internal machinery of the
# Icon interpreter. Some knowledge of the interpreter is needed to use
# these profitably; misuse can lead to memory violations.
#
# dword(x) return d-word of descriptor
# vword(x) return v-word of descriptor
# descriptor(d,v) construct descriptor from d-word and v-word
# peek(addr,n) return contents of memory as n-character string
# (if n is omitted, return Icon integer at addr)
# spy(addr,n) return string pointer to memory, without copying
#
############################################################################
#
# Requires: Dynamic loading
#
############################################################################
*/
#include "icall.h"
int dword(int argc, descriptor argv[]) /*: return descriptor d-word */
{
if (argc == 0)
Fail;
else
RetInteger(argv[1].dword);
}
int vword(int argc, descriptor argv[]) /*: return descriptor v-word */
{
if (argc == 0)
Fail;
else
RetInteger(argv[1].vword);
}
int icon_descriptor(int argc, descriptor argv[]) /*: construct descriptor */
{
ArgInteger(1);
ArgInteger(2);
argv[0].dword = argv[1].vword;
argv[0].vword = argv[2].vword;
Return;
}
int peek(int argc, descriptor argv[]) /*: load value from memory */
{
ArgInteger(1);
if (argc > 1) {
ArgInteger(2);
RetStringN((void *)IntegerVal(argv[1]), IntegerVal(argv[2]));
}
else
RetInteger(*(word *)IntegerVal(argv[1]));
}
int spy(int argc, descriptor argv[]) /*: create spy-port to memory */
{
ArgInteger(1);
ArgInteger(2);
RetConstStringN((void *)IntegerVal(argv[1]), IntegerVal(argv[2]));
}