1*a1bf3f78SToomas Soome /* 2*a1bf3f78SToomas Soome * stub main for testing Ficl 3*a1bf3f78SToomas Soome * $Id: main.c,v 1.2 2010/09/10 09:01:28 asau Exp $ 4*a1bf3f78SToomas Soome */ 5*a1bf3f78SToomas Soome /* 6*a1bf3f78SToomas Soome * Copyright (c) 1997-2001 John Sadler (john_sadler@alum.mit.edu) 7*a1bf3f78SToomas Soome * All rights reserved. 8*a1bf3f78SToomas Soome * 9*a1bf3f78SToomas Soome * Get the latest Ficl release at http://ficl.sourceforge.net 10*a1bf3f78SToomas Soome * 11*a1bf3f78SToomas Soome * I am interested in hearing from anyone who uses Ficl. If you have 12*a1bf3f78SToomas Soome * a problem, a success story, a defect, an enhancement request, or 13*a1bf3f78SToomas Soome * if you would like to contribute to the Ficl release, please 14*a1bf3f78SToomas Soome * contact me by email at the address above. 15*a1bf3f78SToomas Soome * 16*a1bf3f78SToomas Soome * L I C E N S E and D I S C L A I M E R 17*a1bf3f78SToomas Soome * 18*a1bf3f78SToomas Soome * Redistribution and use in source and binary forms, with or without 19*a1bf3f78SToomas Soome * modification, are permitted provided that the following conditions 20*a1bf3f78SToomas Soome * are met: 21*a1bf3f78SToomas Soome * 1. Redistributions of source code must retain the above copyright 22*a1bf3f78SToomas Soome * notice, this list of conditions and the following disclaimer. 23*a1bf3f78SToomas Soome * 2. Redistributions in binary form must reproduce the above copyright 24*a1bf3f78SToomas Soome * notice, this list of conditions and the following disclaimer in the 25*a1bf3f78SToomas Soome * documentation and/or other materials provided with the distribution. 26*a1bf3f78SToomas Soome * 27*a1bf3f78SToomas Soome * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 28*a1bf3f78SToomas Soome * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 29*a1bf3f78SToomas Soome * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 30*a1bf3f78SToomas Soome * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 31*a1bf3f78SToomas Soome * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 32*a1bf3f78SToomas Soome * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 33*a1bf3f78SToomas Soome * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 34*a1bf3f78SToomas Soome * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 35*a1bf3f78SToomas Soome * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 36*a1bf3f78SToomas Soome * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 37*a1bf3f78SToomas Soome * SUCH DAMAGE. 38*a1bf3f78SToomas Soome */ 39*a1bf3f78SToomas Soome 40*a1bf3f78SToomas Soome #include <stdio.h> 41*a1bf3f78SToomas Soome #include <stdlib.h> 42*a1bf3f78SToomas Soome #include <unistd.h> 43*a1bf3f78SToomas Soome #include <termios.h> 44*a1bf3f78SToomas Soome #include <sys/errno.h> 45*a1bf3f78SToomas Soome 46*a1bf3f78SToomas Soome #include <ficl.h> 47*a1bf3f78SToomas Soome #include <ficlplatform/emu.h> 48*a1bf3f78SToomas Soome #include <libtecla.h> 49*a1bf3f78SToomas Soome 50*a1bf3f78SToomas Soome #define LINELEN 1024 51*a1bf3f78SToomas Soome #define HISTORY 2048 52*a1bf3f78SToomas Soome 53*a1bf3f78SToomas Soome static char * 54*a1bf3f78SToomas Soome prompt(void) 55*a1bf3f78SToomas Soome { 56*a1bf3f78SToomas Soome static char prompt[20]; /* probably too large, but well... */ 57*a1bf3f78SToomas Soome char *pr, *p, *cp, *ev; 58*a1bf3f78SToomas Soome int n = 0; 59*a1bf3f78SToomas Soome 60*a1bf3f78SToomas Soome if ((cp = getenv("prompt")) == NULL) 61*a1bf3f78SToomas Soome cp = ">"; 62*a1bf3f78SToomas Soome pr = p = strdup(cp); 63*a1bf3f78SToomas Soome 64*a1bf3f78SToomas Soome while (*p != 0) { 65*a1bf3f78SToomas Soome if ((*p == '$') && (*(p+1) == '{')) { 66*a1bf3f78SToomas Soome for (cp = p + 2; (*cp != 0) && (*cp != '}'); cp++) 67*a1bf3f78SToomas Soome ; 68*a1bf3f78SToomas Soome *cp = 0; 69*a1bf3f78SToomas Soome ev = getenv(p + 2); 70*a1bf3f78SToomas Soome 71*a1bf3f78SToomas Soome if (ev != NULL) 72*a1bf3f78SToomas Soome n = sprintf(prompt+n, "%s", ev); 73*a1bf3f78SToomas Soome p = cp + 1; 74*a1bf3f78SToomas Soome continue; 75*a1bf3f78SToomas Soome } 76*a1bf3f78SToomas Soome prompt[n++] = *p; 77*a1bf3f78SToomas Soome p++; 78*a1bf3f78SToomas Soome } 79*a1bf3f78SToomas Soome if (prompt[n - 1] != ' ') 80*a1bf3f78SToomas Soome prompt[n++] = ' '; 81*a1bf3f78SToomas Soome prompt[n] = '\0'; 82*a1bf3f78SToomas Soome free(pr); 83*a1bf3f78SToomas Soome return (prompt); 84*a1bf3f78SToomas Soome } 85*a1bf3f78SToomas Soome 86*a1bf3f78SToomas Soome int 87*a1bf3f78SToomas Soome main(int argc, char **argv) 88*a1bf3f78SToomas Soome { 89*a1bf3f78SToomas Soome int returnValue = 0; 90*a1bf3f78SToomas Soome char *buffer; 91*a1bf3f78SToomas Soome GetLine *gl; 92*a1bf3f78SToomas Soome ficlVm *vm; 93*a1bf3f78SToomas Soome struct winsize ws; 94*a1bf3f78SToomas Soome int cols = 80, rows = 24; 95*a1bf3f78SToomas Soome 96*a1bf3f78SToomas Soome if (ioctl(1, TIOCGWINSZ, &ws) != -1) { 97*a1bf3f78SToomas Soome if (ws.ws_col) 98*a1bf3f78SToomas Soome cols = ws.ws_col; 99*a1bf3f78SToomas Soome if (ws.ws_row) 100*a1bf3f78SToomas Soome rows = ws.ws_row; 101*a1bf3f78SToomas Soome } 102*a1bf3f78SToomas Soome 103*a1bf3f78SToomas Soome clearenv(); 104*a1bf3f78SToomas Soome asprintf(&buffer, "%d", cols); 105*a1bf3f78SToomas Soome setenv("COLUMNS", buffer, 1); 106*a1bf3f78SToomas Soome free(buffer); 107*a1bf3f78SToomas Soome asprintf(&buffer, "%d", rows); 108*a1bf3f78SToomas Soome setenv("LINES", buffer, 1); 109*a1bf3f78SToomas Soome free(buffer); 110*a1bf3f78SToomas Soome 111*a1bf3f78SToomas Soome if (getenv("prompt") == NULL) 112*a1bf3f78SToomas Soome setenv("prompt", "${interpret}", 1); 113*a1bf3f78SToomas Soome if (getenv("interpret") == NULL) 114*a1bf3f78SToomas Soome setenv("interpret", "ok", 1); 115*a1bf3f78SToomas Soome 116*a1bf3f78SToomas Soome if ((vm = bf_init("", NULL)) == NULL) 117*a1bf3f78SToomas Soome return (ENOMEM); 118*a1bf3f78SToomas Soome returnValue = ficlVmEvaluate(vm, ".ver .( " __DATE__ " ) cr quit"); 119*a1bf3f78SToomas Soome 120*a1bf3f78SToomas Soome /* 121*a1bf3f78SToomas Soome * load files specified on command-line 122*a1bf3f78SToomas Soome */ 123*a1bf3f78SToomas Soome if (argc > 1) { 124*a1bf3f78SToomas Soome asprintf(&buffer, ".( loading %s ) cr include %s\n cr", 125*a1bf3f78SToomas Soome argv[1], argv[1]); 126*a1bf3f78SToomas Soome returnValue = ficlVmEvaluate(vm, buffer); 127*a1bf3f78SToomas Soome free(buffer); 128*a1bf3f78SToomas Soome } 129*a1bf3f78SToomas Soome 130*a1bf3f78SToomas Soome if ((gl = new_GetLine(LINELEN, HISTORY)) == NULL) { 131*a1bf3f78SToomas Soome bf_fini(); 132*a1bf3f78SToomas Soome return (ENOMEM); 133*a1bf3f78SToomas Soome } 134*a1bf3f78SToomas Soome 135*a1bf3f78SToomas Soome while (returnValue != FICL_VM_STATUS_USER_EXIT) { 136*a1bf3f78SToomas Soome if ((buffer = gl_get_line(gl, prompt(), NULL, -1)) == NULL) 137*a1bf3f78SToomas Soome break; 138*a1bf3f78SToomas Soome returnValue = bf_run(buffer); 139*a1bf3f78SToomas Soome } 140*a1bf3f78SToomas Soome 141*a1bf3f78SToomas Soome gl = del_GetLine(gl); 142*a1bf3f78SToomas Soome bf_fini(); 143*a1bf3f78SToomas Soome return (returnValue); 144*a1bf3f78SToomas Soome } 145