The R Project SVN R

Rev

Rev 6192 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

/*
 *  R : A Computer Langage for Statistical Data Analysis
 *  Copyright (C) 1995, 1996  Robert Gentleman and Ross Ihaka
 *  Copyright (C) 1997-1999   Robert Gentleman, Ross Ihaka
 *                            and the R Development Core Team
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include "Defn.h"
#include "Print.h"
#include "Fileio.h"
#include "IOStuff.h"
#include "Parse.h"
#include <stdio.h>

/*
 * ed, vi etc have 3 parameters. the data, a file and an editor
 *
 * if file is specified then the given file is used (and not removed on exit) if
 * file is not specified then a temporary file is used; since only one
 * temporary file is used for an entire session previous editing is lost
 *
 * if data is specified then it is passed out to be edited; if data is not
 * specified then either file (if specified) or the temporary file is used
 * (thus errors can be re-editied by calling edit a second time with no
 * arguments).
 *
 * if the editor is specified then the specified editor is invoked if possible
 * and an error message reported otherwise
 */

static char *DefaultFileName;

void InitEd()
{
    DefaultFileName = tmpnam(NULL);
}


SEXP do_edit(SEXP call, SEXP op, SEXP args, SEXP rho)
{
        errorcall(call, "edit() is unavailable");
    return NULL;
    /*
    int i, status;
    SEXP x, fn, envir, ed;
    char *filename, *editcmd, *vmaxsave;
    FILE *fp;

    checkArity(op, args);

    vmaxsave = vmaxget();

    x = CAR(args);
    if (TYPEOF(x) == CLOSXP) envir = CLOENV(x);
    else envir = R_NilValue;
    PROTECT(envir);

    fn = CADR(args);
    if (!isString(fn))
        error("invalid argument to edit()");

    if (LENGTH(STRING(fn)[0]) > 0) {
        filename = R_alloc(strlen(CHAR(STRING(fn)[0])), sizeof(char));
        strcpy(filename, CHAR(STRING(fn)[0]));
    }
    else filename = DefaultFileName;

    if (x != R_NilValue) {
        if((fp=R_fopen(R_ExpandFileName(filename), "w")) == NULL)
            errorcall(call, "unable to open file");
        x = deparse1(x, 0);
        for (i=0; i<LENGTH(x); i++)
            fprintf(fp, "%s\n", CHAR(STRING(x)[i]));
        fclose(fp);
    }

    ed = CAR(CDDR(args));
    if (!isString(ed))
        error("editor type not valid");
    editcmd = R_alloc(strlen(CHAR(STRING(ed)[0]))+strlen(filename)+2, sizeof(char));
    sprintf(editcmd, "%s %s", CHAR(STRING(ed)[0]), filename);
    system(editcmd);

    if((fp=R_fopen(R_ExpandFileName(filename), "r")) == NULL)
        errorcall(call, "unable to open file to read");
    R_ParseCnt = 0;
    x = R_ParseFile(fp, -1, &status);
    if (status != PARSE_OK)
        errorcall(call, "An error occurred on line %d\n use a command like\n x <- vi()\n to recover", R_ParseError);
    else
        fclose(fp);
    R_ResetConsole();
    x = eval(x, R_GlobalEnv);
    if (TYPEOF(x) == CLOSXP && envir != R_NilValue)
        CLOENV(x) = envir;
    UNPROTECT(1);
    vmaxset(vmaxsave);
    return (x);*/
}