The R Project SVN R-packages

Rev

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

/*
 *  R.app : a Cocoa front end to: "R A Computer Language for Statistical Data Analysis"
 *  
 *  R.app Copyright notes:
 *                     Copyright (C) 2004-5  The R Foundation
 *                     written by Stefano M. Iacus and Simon Urbanek
 *
 *                  
 *  R Copyright notes:
 *                     Copyright (C) 1995-1996   Robert Gentleman and Ross Ihaka
 *                     Copyright (C) 1998-2001   The R Development Core Team
 *                     Copyright (C) 2002-2004   The R Foundation
 *
 *  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.
 *
 *  A copy of the GNU General Public License is available via WWW at
 *  http://www.gnu.org/copyleft/gpl.html.  You can also obtain it by
 *  writing to the Free Software Foundation, Inc., 59 Temple Place,
 *  Suite 330, Boston, MA  02111-1307  USA.
 *
 *  Created by Simon Urbanek on Wed Dec 10 2003.
 *
 */

#import <Cocoa/Cocoa.h>

#import <Foundation/Foundation.h>
#import "RSEXP.h"
#import "Rcallbacks.h"

/* some names are re-mapped in R which is deadly */
#ifdef parse
#undef parse
#endif
#ifdef error
#undef error
#endif

#define RENGINE_BEGIN [self begin]
#define RENGINE_END   [self end]

extern int insideR;
extern BOOL preventReentrance;

@interface REngine : NSObject {
    /* the object handling all regular R callbacks - the Rcallback.h for the protocol definition - this one must be provided */
    id <REPLHandler> replHandler;
    /* this callback handler is optional and involves various GUI stuff. those callback are activated only if Aqua/Cocoa is specified as GUI */
    id <CocoaHandler> cocoaHandler;
    
    /* set to NO if the engine is initialized but activate was not called yet - that is R was not really initialized yet */
    BOOL active;

    /* set to YES if R REPL is running */
    BOOL loopRunning;

    BOOL protectedMode;
    
    /* last error string */
    NSString* lastError;
    
    /* if >0 ProcessEvents doesn't call the event handler */
    int maskEvents;

    /* initial arguments used by activate to initialize R */
    int  argc;
    char **argv;
    
    /* SaveAction (yes/no/ask - anything else is treated as ask) */
    NSString *saveAction;
    
    NSThread *replThread; // thread on which the REPL is run or nil if none
}

+ (REngine*) mainEngine;
+ (id <REPLHandler>) mainHandler;
+ (id <CocoaHandler>) cocoaHandler;

- (id) init;
- (id) initWithHandler: (id <REPLHandler>) hand;
- (id) initWithHandler: (id <REPLHandler>) hand arguments: (char**) args;
- (BOOL) activate;

- (BOOL) isLoopRunning;
- (BOOL) isActive;

- (NSString*) lastError;

- (void) begin;
- (void) end;

- (BOOL) allowEvents;

- (BOOL) beginProtected;
- (void) endProtected;

// those must be called *before* activate and *after* init
- (void) setSaveAction: (NSString*) action; // yes/no/ask
- (NSString*) saveAction;
- (void) disableRSignalHandlers: (BOOL) disable;

// eval mode
- (RSEXP*) parse: (NSString*) str;
- (RSEXP*) parse: (NSString*) str withParts: (int) count;
- (RSEXP*) evaluateExpressions: (RSEXP*) expr;
- (RSEXP*) evaluateString: (NSString*) str;
- (RSEXP*) evaluateString: (NSString*) str withParts: (int) count;
- (BOOL)   executeString: (NSString*) str; // void eval

// REPL mode
- (id <REPLHandler>) handler;
- (id <CocoaHandler>) cocoaHandler; // beware, nil is legal!
- (void) setCocoaHandler: (id <CocoaHandler>) ch;
- (void) runREPL; // starts REPL and does not return until REPL finishes
- (void) runDelayedREPL; // starts REPL with delayed=1 thus returns immediately

@end