Skip to content

Instantly share code, notes, and snippets.

@wasabili
Created December 12, 2010 05:49
Show Gist options
  • Save wasabili/737881 to your computer and use it in GitHub Desktop.
Save wasabili/737881 to your computer and use it in GitHub Desktop.
Brainfxxk Interpreter as a LKM
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("wasabiz");
void run(const char* ipt)
{
char dat[30000];
int ptr = 0;
int skr = 0;
int brcn = 0;
int i;
char output[256];
int len = 0;
for(i=0;i<300;i++) dat[i] = 0;
while (ipt[skr]!='\0') {
//printf("%c\n", ipt[skr]);
switch (ipt[skr]) {
case '>':
ptr++;
break;
case '<':
ptr--;
break;
case '+':
dat[ptr]--;
break;
case '-':
dat[ptr]++;
break;
case '.':
// Output dat[ptr]
// putchar(-dat[ptr]);
output[len] = -dat[ptr];
len++;
break;
case ',':
// Input to dat[ptr]
break;
case '[':
/* Jump to ] if dat[ptr] is 0 */
if(!dat[ptr]){
brcn = 0;
while(1){
skr++;
if(ipt[skr] == '[') {
brcn++;
}else if(ipt[skr] == ']') {
brcn--;
if(!brcn) break;
}
}
skr--;
}
break;
case ']':
/* Jump to [ if dat[ptr] is not 0 */
if(dat[ptr]){
brcn = 0;
while(1){
skr--;
if(ipt[skr] == ']') {
brcn++;
}else if(ipt[skr] == '['){
if(!brcn) break;
brcn--;
}
}
skr--;
}
break;
}
skr++;
}
output[len] = '\0';
printk( KERN_INFO "%s", output);
}
static int
proc_write( struct file *flip, const char *buf, unsigned long len, void *data)
{
char input_buf[1024];
if (len >= 256) {
printk( KERN_WARNING "proc_write len = %lu\n", len);
return -ENOSPC;
}
if (copy_from_user(input_buf, buf, len)) return -EFAULT;
input_buf[len] = '\0';
run(input_buf);
printk( KERN_INFO "proc_write %s\n", input_buf );
return len;
}
static int
proc_read( char *page, char **start, off_t offset, int count, int *eof, void *data )
{
int len;
len = sprintf( page, "okok" );
printk( KERN_INFO "proc_read len = %d\n", len );
*eof = 1;
return len;
}
#define PROCNAME "driver/brainfuck"
static int __init bfmod_init(void)
{
struct proc_dir_entry *entry;
entry = create_proc_entry( PROCNAME, 0666, NULL);
if (entry) {
entry->write_proc = proc_write;
entry->read_proc = proc_read;
} else {
printk( KERN_ERR "create_proc_entry failed\n" );
return -EBUSY;
}
printk( KERN_INFO "hoge mod is loaded\n" );
return 0;
}
static void __exit bfmod_exit(void)
{
remove_proc_entry( PROCNAME, NULL );
printk( KERN_INFO "hoge exit hoge hoge" );
}
module_init(bfmod_init);
module_exit(bfmod_exit);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment