Warning: this is an htmlized version!
The original is across this link,
and the conversion rules are here.
/*
 * This file: 
 * http://angg.twu.net/peek/peek.c
 * http://angg.twu.net/peek/peek.c.html
 *         (find-angg "peek/peek.c")
 * Author: Eduardo Ochs <eduardoochs@gmail.com>
 * Version: 2011jun02
 *
 * Quick index:
 * «.description»	(to "description")
 * «.build»		(to "build")
 * «.init»		(to "init")
 * «.tests»		(to "tests")

 * «description»  (to ".description")
 * This file implements four very low-level functions.
 * They work like this:
 *      str = peek_(addr, len)
 *            poke_(addr, str)
 *   addr = malloc_(len)
 *            free_(addr)
 * where "addr" and "len" are integers, and "str" is a string.
 * The functions are placed in the global namespace.
 * There is no range checking at all, just like in the old Forth days.
 * Have fun! 8-)
 *
 * «build»  (to ".build")
 * We compile this with:
 * (find-angg "peek/peek-0.0.1-0.rockspec" "build")
 *
 * Old stuff related to this:
 * (find-angg "DAVINCI/peek.c")
 * (find-angg "vtutil4/piofontx.c")
 * See also:
 * (find-pilw3m "index.html")
 * (find-pilw3m "index.html" "The C API")
 *
 * Brief and hurried announcement:
 * http://article.gmane.org/gmane.comp.lang.lua.general/79307
 *
 * Thanks to: Marc Simpson, ToxicFrog
*/



#include <stdlib.h>		// (find-man "3 malloc")
#include <string.h>		// (find-man "3 memcpy")
#include <lua.h>
#include <lauxlib.h>

// (find-luamanualw3m "#luaL_checkint")
// (find-luamanualw3m "#lua_pushlstring")
static int lua_peek(lua_State* L) {
  int addr = luaL_checkint(L, 1);
  int len  = luaL_checkint(L, 2);
  lua_pushlstring(L, (void *)addr, len);
  return 1;
}

// (find-luamanualw3m "#luaL_checklstring")
// (find-node "(libc)Function Index" "memcpy")
static int lua_poke(lua_State* L) {
  int addr = luaL_checkint(L, 1);
  int len = 0; const char* straddr = luaL_checklstring(L, 2, &len);
  memcpy((void *)addr, straddr, len);
  return 0;
}

// (find-luamanualw3m "#luaL_checkint")
// (find-luamanualw3m "#lua_pushinteger")
// (find-node "(libc)Function Index" "* malloc")
static int lua_malloc(lua_State* L) {
  int len = luaL_checkint(L, 1);
  lua_pushinteger(L, (int)malloc(len));
  return 1;
}

// (find-node "(libc)Function Index" "* free")
static int lua_free(lua_State* L) {
  int addr = luaL_checkint(L, 1);
  free((void *)addr);
  return 0;
}

// (find-luamanualw3m "#lua_topointer")
// (find-lua51grep "grep -nH -e lua_topointer src/*")
// (find-lua51srcfile "lapi.c" "lua_topointer")
// http://www.lua.org/source/5.1/lapi.c.html#lua_topointer
// (find-lua51srcfile "lua.h" "LUA_TFUNCTION")
// (find-lua51srcfile "lobject.h" "#define ttype")
static int lua_toptr(lua_State* L) {
  lua_pushinteger(L, (int)lua_topointer(L, -1));
  return 1;
}

// (find-luamanualw3m "#lua_register")
// (find-luamanualw3m "#pdf-package.loaders" "luaopen_")
// "peek_init" is not a standard name...
// It sounds lua-4.0-ish.
// What should I use instead?
// «init»  (to ".init")
// LUALIB_API int peek_init(lua_State *L) {
LUALIB_API int luaopen_peek(lua_State *L) {
  lua_register(L, "peek_",   lua_peek);
  lua_register(L, "poke_",   lua_poke);
  lua_register(L, "malloc_", lua_malloc);
  lua_register(L, "free_",   lua_free);
  lua_register(L, "toptr_",  lua_toptr);
  return 0;
}


// 2011apr17: 
// (find-luamanualw3m "#pdf-package.loaders")
// (find-luamanualw3m "#pdf-package.loaders" "luaopen_")


/*
 * «tests»  (to ".tests")
 * I moved the tests to the rockspec:
 * (find-angg "peek/peek-0.0.1-0.rockspec" "test")
 */

/*
 * Local Variables:
 * coding:             raw-text-unix
 * ee-anchor-format:   "«%s»"
 * End:
 */