home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Elysian Archive
/
AmigaElysianArchive.iso
/
wp_dtp
/
xdme1821.lha
/
XDME
/
smallspc.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-30
|
17KB
|
812 lines
/******************************************************************************
MODUL
smallspc.c
DESCRIPTION
minimal interface for special variables
setting and reading
NOTES
look into future/...
BUGS
none known
TODO
entries for all new spcvars
join the 3 functions into 1
create a list that is scanned in a loop
EXAMPLES
SEE ALSO
vars.c
INDEX
HISTORY
21 Nov 92 null created
******************************************************************************/
/**************************************
Includes
**************************************/
#include "defs.h"
/**************************************
Globale Variable
**************************************/
Prototype char* GetSpecialVar (char* Name);
Prototype char* GetSpecialInt (char* Name);
Prototype char* GetSpecialFlag(char* Name);
Prototype char SetSpecialFlag(char* Name, char* Value);
Prototype char SetSpecialInt (char* Name, char* Value);
Prototype char SetSpecialVar (char* Name, char* Value);
Prototype void do_togglespecialflag(void);
Prototype void do_setspecialvar(void);
extern UBYTE Fstr[];
extern UBYTE Rstr[];
/**************************************
Interne Defines & Strukturen
**************************************/
const char* N_ascii = "ascii";
const char* N_autoindent = "autoindent";
const char* N_autosplit = "autosplit";
const char* N_autounblock = "autounblock";
const char* N_activetofront = "activetofront";
const char* N_bgpen = "bgpen";
const char* N_bbpen = "bbpen";
const char* N_colno = "colno";
const char* N_currentline = "currentline";
const char* N_currentword = "currentword";
const char* N_cursorpen = "cursorpen";
const char* N_debug = "debug";
const char* N_fgpen = "fgpen";
const char* N_filename = "filename";
const char* N_findstr = "findstr";
const char* N_fname = "fname";
const char* N_fpath = "fpath";
const char* N_globalsearch = "globalsearch";
const char* N_hgpen = "hgpen";
const char* N_ignorecase = "ignorecase";
const char* N_infixmode = "infixmode";
const char* N_insertmode = "insertmode";
const char* N_keytable = "keytable";
const char* N_lineno = "lineno";
const char* N_margin = "margin";
const char* N_menustrip = "menustrip";
const char* N_modified = "modified";
const char* N_parcol = "parcol";
const char* N_qualifiers = "qualifiers";
const char* N_refpaths = "refpaths";
const char* N_repstr = "repstr";
const char* N_restofline = "restofline";
const char* N_rexxport = "rexxport";
const char* N_savetabs = "savetabs";
const char* N_scanf = "scanf";
const char* N_tabstop = "tabstop";
const char* N_textnames = "textnames";
const char* N_tpen = "tpen";
const char* N_viewmode = "viewmode";
const char* N_wordwrap = "wordwrap";
const char* N_windowcycling = "windowcycling";
/**************************************
Interne Variable
**************************************/
/**************************************
Interne Prototypes
**************************************/
Prototype char* current_word (void);
/*
** GetSpecialVar - Get one of the internal special String Vars:
**
** >name == the name of the variable to search for
** <ptr to malloced string
** <NULL == not found or error
*/
char*
GetSpecialVar(char* Name)
{
int i,j;
char* str; /* return */
char* ptr; /* help: if not NULL, anything was found */
str = NULL;
ptr = NULL;
i = 0;
j = 0;
/* printf("Vn=%s\n",Name); */
if ((Name == NULL) || (Name[0] == 0))
{
return(NULL);
} /* if */
/* String Variables */
switch (Name[0])
{
case 'c':
if (strcmp (Name, N_currentline) == 0)
{ /* old */
ptr = Current;
} else
if (strcmp (Name, N_currentword) == 0)
{ /* new */
ptr = current_word();
} /* if */
break;
case 'f':
if (strcmp (Name, N_filename) == 0)
{ /* old */
ptr = Ep->name;
} else
if (strcmp (Name, N_fname) == 0)
{ /* old */
ptr = fname(Ep->name);
} else
if (strcmp (Name, N_findstr) == 0)
{ /* old */
ptr = Fstr;
} /* if */
break;
case 'k': /* PATCH_NULL [01 Feb 1993] : added */
if (strcmp (Name, N_keytable) == 0)
{
if (ptr = currenthash()) {
ptr = ((struct Node *)ptr)->ln_Name;
} /* if */
} /* if */
break;
case 'm': /* PATCH_NULL [01 Feb 1993] : added */
if (strcmp (Name, N_menustrip) == 0)
{
if (ptr = currentmenu()) {
ptr = ((struct Node *)ptr)->ln_Name;
} /* if */
} /* if */
break;
case 'r':
if (strcmp (Name, N_repstr) == 0)
{ /* old */
ptr = Rstr;
} else
if (strcmp (Name, N_restofline) == 0)
{
if (Clen>=Ep->column) {
ptr = Current + Ep->column; /* DANGER */
} else {
ptr = Current + Clen;
} /* if */
} /* if */
break;
case 's':
if (strcmp (Name, N_scanf) == 0)
{ /* old */
ptr = String;
} /* if */
break;
default:
break;
} /* switch */
if (ptr != NULL)
{
str = malloc (strlen(ptr)+1);
if (str)
{
strcpy(str, ptr);
return(str);
} else if (*ptr != 0)
{
nomemory();
abort(NULL);
} else
{
return(str);
} /* if */
} /* if */
return(NULL);
} /* GetSpcVar */
/*
** SetSpecialVar - set one of DME's internal special String vars
**
** >Name - name of the variable to modify
** >Value - new value of the variable
** <0 == name not found
** <1 == ok ( also if variable is readonly )
*/
char
SetSpecialVar(char* Name, char* Value)
{
char* ptr;
int len;
if ((Name == NULL) || (Name[0] == 0))
{
return(0);
} /* if */
ptr = NULL;
len = LINE_LENGTH;
/* printf("Vs=%s\n",Name); */
if (strcmp (Name, N_filename) == 0)
{
ptr = Ep->name;
len = 63;
} else
if (strcmp (Name, N_findstr) == 0)
{
ptr = Fstr;
} else
if (strcmp (Name, N_repstr) == 0)
{
ptr = Rstr;
} else
if (strcmp (Name, N_scanf) == 0)
{
ptr = String;
} else
if (strcmp (Name, N_currentline) == 0)
{
abort(1);
} else
if (strcmp (Name, N_currentword) == 0)
{
abort(1);
} else
if (strcmp (Name, N_restofline) == 0)
{
abort(1);
} /* if */
if (ptr)
{
strncpy(ptr, Value, len);
return(1); /* found */
} else
return(0); /* not found */
} /* SetSpecialVar */
/*
** GetSpecialInt - Get one of the internal special Integer Vars:
**
** >name == the name of the variable to search for
** <ptr to malloced string
** <NULL == not found or error
*/
char*
GetSpecialInt(char* Name)
{
int found;
long i;
char* str; /* return */
char buffer[16]; /* help: convert numbers here */
found = 0;
/* printf("In=%s\n",Name); */
if (strcmp (Name, N_ascii) == 0)
{ /* current char */
i = Current[Ep->column];
found = 1;
} else
if (strcmp (Name, N_bbpen) == 0)
{ /* highlight pen */
i = BLOCK_BPEN;
found = 1;
} else
if (strcmp (Name, N_bgpen) == 0)
{ /* background pen */
i = TEXT_BPEN;
found = 1;
} else
if (strcmp (Name, N_colno) == 0)
{ /* current xpos */
i = Ep->column + 1;
found = 1;
} else
if (strcmp (Name, N_fgpen) == 0)
{ /* foreground pen */
i = TEXT_FPEN;
found = 1;
} else
if (strcmp (Name, N_hgpen) == 0)
{ /* highlight pen */
i = BLOCK_FPEN;
found = 1;
} else
if (strcmp (Name, N_lineno) == 0)
{ /* current ypos */
i = Ep->line + 1;
found = 1;
} else
if (strcmp (Name, N_margin) == 0)
{ /* right margin for wordwrap */
i = Ep->config.margin;
found = 1;
} else
if (strcmp (Name, N_parcol) == 0)
{ /* left margin of paragraph? */
i = Ep->config.wwcol;
found = 1;
} else
if (strcmp (Name, N_tpen) == 0)
{ /* title bar rendering */
i = TITLE_BPEN;
found = 1;
} else
if (strcmp (Name, N_tabstop) == 0)
{
i = Ep->config.tabstop;
found = 1;
} /* if */
if (found)
{
sprintf(buffer,"%ld",i);
str = malloc(strlen(buffer)+1);
if (str)
{
strcpy(str, buffer);
return(str);
} else
{
nomemory();
abort(NULL);
} /* if */
} /* if */
return(NULL);
} /* GetSpecialInt */
/*
* GetSpecialFlag - Get one of the internal special Flags:
*
* >name == the name of the variable to search for
* <ptr to malloced string
* <NULL == not found or error
*/
char*
GetSpecialFlag(char* Name)
{
char i,found;
char* str; /* return */
char buffer[4]; /* help: convert numbers here */
/* printf("Fn=%s\n",Name); */
found = 0;
/* locals */
if (strcmp (Name, N_autounblock) == 0)
{
i = Ep->config.autounblock ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_autoindent) == 0)
{
i = Ep->config.autoindent ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_autosplit) == 0)
{
i = Ep->config.autosplit ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_debug) == 0)
{
i = globalflags.debug ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_infixmode) == 0)
{ /* while searching */
i = Ep->config.ignorecase ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_insertmode) == 0)
{ /* <-> overwrite */
i = Ep->config.insertmode ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_modified) == 0)
{ /* */
i = Ep->modified ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_viewmode) == 0)
{
i = Ep->viewmode ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_wordwrap) == 0)
{
i = Ep->config.wordwrap ? 1 : 0;
found = 1;
} else
/* globals */
if (strcmp (Name, N_activetofront) == 0)
{
i = globalflags.ActivateToFront ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_globalsearch) == 0)
{
i = globalflags.global_search ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_infixmode) == 0)
{ /* <-> prefixmode / math2 */
i = MathInfix ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_savetabs) == 0)
{
i = globalflags.Savetabs ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_windowcycling) == 0)
{
i = globalflags.Windowcycling ? 1 : 0;
found = 1;
/* aborted */
} /* if */
if (found)
{
sprintf(buffer,"%ld",i);
if (str = strdup(buffer))
{
return(str);
} else
{
nomemory();
abort(NULL);
} /* if */
} /* if */
return(NULL);
} /* GetSpecialFlag */
/*
* SetSpecialInt - Set a special Integer variable
*
* >Name - name of the variable to modify
* >value - new value of the variable
* <0 == name not found or value was no integer
* <1 == name found (also if variable is write only)
*/
char
SetSpecialInt(char* name, char* value)
{
int val;
char found = 0;
/* printf("Is=%s\n",name); */
if (!is_number(value))
{ /* --- that is not correct but easy */
return(0);
} /* if */
val = atoi(value);
if ((strcmp (name, N_bgpen) == 0) ||
(strcmp (name, N_colno) == 0) ||
(strcmp (name, N_lineno) == 0) ||
(strcmp (name, N_fgpen) == 0) ||
(strcmp (name, N_hgpen) == 0) ||
(strcmp (name, N_tpen) == 0))
{
abort(1);
} else
if (strcmp (name, N_ascii) == 0)
{
if (!Ep->viewmode)
{
Current[Ep->column] = val / LINE_LENGTH;
} /* if */
} else
if (strcmp (name, N_margin) == 0)
{
Ep->config.margin = val % (LINE_LENGTH);
} else
if (strcmp (name, N_parcol) == 0)
{
Ep->config.wwcol = val % (LINE_LENGTH);
} else
if (strcmp (name, N_tabstop) == 0)
{
Ep->config.tabstop = val % (LINE_LENGTH);
} else
{
return(0); /* not found */
} /* if */
return(1); /* found */
} /* SetSpecialInt */
/*
* SetSpecialFlag - Set a specialFlag
*
* >Name - name of the variable to modify
* >value - new value of the variable
* <0 == name not found
* <1 == ok ( also if other error)
*/
char
SetSpecialFlag(char* name, char* value)
{
char* comment;
char buffer[32];
char* com[2];
BOOL oldmode;
BOOL newmode;
BOOL fetch; /* TRUE, wenn oldmode gelesen werden soll */
comment = NULL;
com[0] = "Off";
com[1] = "On";
fetch = TRUE;
/* printf("Fs=%s\n",name); */
/* --- local flags */
for (;;)
{
if (strcmp (name, N_autounblock) == 0)
{
if (fetch)
oldmode = Ep->config.autounblock;
else
Ep->config.autounblock = newmode;
comment = "Autounblock";
} else if (strcmp (name, N_autoindent) == 0) {
if (fetch)
oldmode = Ep->config.autoindent;
else
Ep->config.autoindent = newmode;
comment = "Autoindent";
} else
if (strcmp (name, N_autosplit) == 0)
{
if (fetch)
oldmode = Ep->config.autosplit;
else
Ep->config.autosplit = newmode;
comment = "Autosplit";
} else
if (strcmp (name, N_ignorecase) == 0)
{ /* search case <-> ignorecase */
if (fetch)
oldmode = Ep->config.ignorecase;
else
Ep->config.ignorecase = newmode;
comment = "Case";
com[0] = "Sensitive";
com[1] = "InSensitive";
} else
if (strcmp (name, N_insertmode) == 0)
{ /* <-> overwrite text */
if (fetch)
oldmode = Ep->config.insertmode;
else
Ep->config.insertmode = newmode;
comment = "Insert mode";
} else
if (strcmp (name, N_wordwrap) == 0)
{
if (fetch)
oldmode = Ep->config.wordwrap;
else
Ep->config.wordwrap = newmode;
comment = "WordWrap";
} else
if (strcmp (name, N_viewmode) == 0)
{
if (fetch)
oldmode = Ep->viewmode;
else
Ep->viewmode = newmode;
comment = "Viewmode";
} else
if (strcmp (name, N_modified) == 0)
{ /* text-modified */
if (fetch)
oldmode = Ep->modified;
else
Ep->modified = newmode;
comment = "Modified";
}
/* --- global flags */
else if (strcmp (name, N_activetofront) == 0)
{
if (fetch)
oldmode = globalflags.ActivateToFront;
else
globalflags.ActivateToFront = newmode;
comment = "Moving Activated Windows To Front";
} else
if (strcmp (name, N_debug) == 0)
{
if (fetch)
oldmode = globalflags.debug;
else
globalflags.debug = newmode;
comment = "Debugging mode";
} else
if (strcmp (name, N_globalsearch) == 0)
{
if (fetch)
oldmode = globalflags.global_search;
else
globalflags.global_search = newmode;
comment = "Global Searching";
} else
#ifdef NOTDEF
if (strcmp (name, N_infixmode) == 0)
{ /* math infixmode <-> prefixmode */
if (fetch)
oldmode = globalflags.MathInfix;
else
globalflags.MathInfix = newmode;
comment = "Infixmode";
} else
#endif
if (strcmp (name, N_savetabs) == 0)
{ /* save tabs or whitespaces */
if (fetch)
oldmode = globalflags.Savetabs;
else
globalflags.Savetabs = newmode;
comment = "SaveTabs";
} else
if (strcmp (name, N_windowcycling) == 0)
{
if (fetch)
oldmode = globalflags.Windowcycling;
else
globalflags.Windowcycling = newmode;
comment = "Windowcycling";
} /* if */
if (!fetch)
break;
if (!comment)
return (0);
newmode = test_arg (value, oldmode);
fetch = FALSE;
sprintf(buffer,"%s %s ",comment, com[newmode]);
title(buffer);
}
return (1); /* found */
} /* SetSpecialFlag */
/*
* This function is to be called for all toggling any special flag
* via a command: flagname mode
* The only thing is - the variable must be treated here
*/
void
do_togglespecialflag()
{
if (!SetSpecialFlag(av[0],av[1]))
abort();
} /* do_togglespecialflag */
/*
* This function might be called for all setting any special var
* via a command: varname mode
* The only thing is - the variable must be treated here
*/
void
do_setspecialvar()
{
if ( !SetSpecialInt(av[0],av[1])
&& !SetSpecialVar(av[0],av[1]) )
abort();
} /* do_setspecialvar */
/*
** Redefine these names to adjust the used buffers to Your settings
** the commands are 'atomic' so there should be no interference to
** other 'atomic' commands using them.
**
** for XDME changed buffers[0]/buffers[1] to tmp_buffer/tmp_buf2
*/
#define firstbuffer tmp_buffer
/*
*! $[SPC.]currentword
*! that read-only special-variable
*! represents "the word under the cursor"
*! that means it finds the beginning of the current word on
*! on its own (but we do not move the cursor) if cursor is
*! not within a word, it returns the next word of the line
*! if there is no next word, an empty string is returned
*! NOTE this variable is not accessible, if PATCH_VARS is not active
*!
** current_word (uses firstbuffer)
**
** Returns the word under the cursor,
** is used by fastscan and should be used by ref and tag instead of
** their own functions
*/
#define isC(ch) (isalnum((ch)) || (ch) == '_')
char * current_word (void)
{
register char* str;
register int i,j;
str = firstbuffer;
i = Ep->column;
while ((i>0) && isC(Current[i]))
{ /* goto beginning of word */
i--;
} /* while */
while ((Current[i]) && !isC(Current[i]))
{ /* skip spaces and other garbage */
i++;
} /* while */
j = 0;
while (isC(Current[i]) && (j <= LINE_LENGTH))
{
str[j] = Current[i]; /* copy "word" into buffer */
j++;
i++;
} /* while */
str[j] = 0;
return (str);
} /* current_word */
/******************************************************************************
***** ENDE smallspc.c
******************************************************************************/