All pastes #15414 Raw Edit

Mine

public text v1 · immutable
#15414 ·published 2005-06-21 21:06 UTC
rendered paste body
/*
 * BF for Asterisk
 *
 * Copyright (C) 2005, David Eder
 *
 * This program is free software, distributed under the terms of
 * the GNU General Public License
 */

#include <../asterisk.h>
#include <asterisk/channel.h>
#include <asterisk/logger.h>
#include <asterisk/module.h>
#include <asterisk/utils.h>
#include <asterisk/pbx.h>
#include <string.h>
#include <stdlib.h>

#define MAX_ARGS 128
static char *tdesc = "BF for the dialplan";
static char *app = "BF";
static char *synopsis = "Execute BF code";
static char *descrip = "  BF(code|input_var|output_var):  Executes code as BF code.\n";

STANDARD_LOCAL_USER;
LOCAL_USER_DECL;

static int bf_exec(struct ast_channel *chan, void *data)
{
        int res = 0;
        char *argv[MAX_ARGS];
        char buf[2048]="";
        char *tmp = (char *)buf;
        int argc = 0;
        char *stringp;
        struct localuser *u;
        char *input;
        int input_pointer = 0;
        char output[4096];
        int output_pointer = 0;
        char m[9999], *n[99], *r=m, *p=m+5000, **s=n, d = 0, c;

        if (!data || ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "BF requires 3 arguments (code,input_var,output_var)\n");
                return -1;
        }
        strncpy(buf, data, sizeof(buf) - 1);

        while ((stringp = strsep(&tmp, "|"))) {
                argv[argc++] = stringp;
        }
        argv[argc] = NULL;

        if(argc != 3) {
                ast_log(LOG_WARNING, "BF requires 3 arguments (code,input_var,output_var)\n");
                return -1;
        }

        input = (char *)pbx_builtin_getvar_helper(chan, argv[1]);

        LOCAL_USER_ADD(u);

        for(strncpy(r,argv[0],4000);(c=*r);r++)
                c-']'||(d>1||(r=*p?*s:(--s,r)),!d||d--),c-'['||d++||(*++s=r),d||(*p+=c=='+',*p-=c=='-',p+=c=='>',
                p-=c=='<',c-'.'||(output[output_pointer++]=*p),c-','||(*p = input[input_pointer++]));

        pbx_builtin_setvar_helper(chan, argv[2], output);

        LOCAL_USER_REMOVE(u);
        return res;
}

int unload_module(void)
{
        STANDARD_HANGUP_LOCALUSERS;
        return ast_unregister_application(app);
}

int load_module(void)
{
        return ast_register_application(app, bf_exec, synopsis, descrip);
}

char *description(void)
{
        return tdesc;
}

int usecount(void)
{
        int res;
        STANDARD_USECOUNT(res);
        return res;
}

char *key()
{
        return ASTERISK_GPL_KEY;
}