home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
500-599
/
ff562.lza
/
Intuisup
/
Editor
/
source.lzh
/
subs.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-10-20
|
8KB
|
309 lines
/*************************************
* *
* Editor v1.0 *
* by Torsten Jürgeleit in 07/91 *
* *
* Subroutines part *
* *
*************************************/
/* Includes */
#include "includes.h"
#include "defines.h"
#include "imports.h"
#include "protos.h"
/* Draw box in given window */
VOID
draw_box(struct Window *win, struct Box *box)
{
struct RastPort *rp = win->RPort;
SetDrMd(rp, (LONG)COMPLEMENT);
Move(rp, (LONG)box->bo_X1, (LONG)box->bo_Y1);
Draw(rp, (LONG)box->bo_X2, (LONG)box->bo_Y1);
Draw(rp, (LONG)box->bo_X2, (LONG)box->bo_Y2);
Draw(rp, (LONG)box->bo_X1, (LONG)box->bo_Y2);
Draw(rp, (LONG)box->bo_X1, (LONG)box->bo_Y1);
}
/* Draw box in given window with border of 1 pixel */
VOID
draw_box_with_border(struct Window *win, struct Box *box)
{
struct RastPort *rp = win->RPort;
SetDrMd(rp, (LONG)COMPLEMENT);
Move(rp, (LONG)(box->bo_X1 - 1), (LONG)(box->bo_Y1 - 1));
Draw(rp, (LONG)(box->bo_X2 + 1), (LONG)(box->bo_Y1 - 1));
Draw(rp, (LONG)(box->bo_X2 + 1), (LONG)(box->bo_Y2 + 1));
Draw(rp, (LONG)(box->bo_X1 - 1), (LONG)(box->bo_Y2 + 1));
Draw(rp, (LONG)(box->bo_X1 - 1), (LONG)(box->bo_Y1 - 1));
}
/* Draw box in given window with offset */
VOID
draw_box_with_offset(struct Window *win, struct Box *box, SHORT xoffset,
SHORT yoffset)
{
struct RastPort *rp = win->RPort;
SetDrMd(rp, (LONG)COMPLEMENT);
Move(rp, (LONG)(box->bo_X1 + xoffset), (LONG)(box->bo_Y1 + yoffset));
Draw(rp, (LONG)(box->bo_X2 + xoffset), (LONG)(box->bo_Y1 + yoffset));
Draw(rp, (LONG)(box->bo_X2 + xoffset), (LONG)(box->bo_Y2 + yoffset));
Draw(rp, (LONG)(box->bo_X1 + xoffset), (LONG)(box->bo_Y2 + yoffset));
Draw(rp, (LONG)(box->bo_X1 + xoffset), (LONG)(box->bo_Y1 + yoffset));
}
/* Get head of EXEC list */
VOID *
get_head(struct List *list)
{
struct Node *node = list->lh_Head;
/* empty list ? */
if (!node->ln_Succ) {
node = NULL;
}
return((VOID *)node);
}
/* Get tail of EXEC list */
VOID *
get_tail(struct List *list)
{
struct Node *node = list->lh_TailPred;
/* empty list ? */
if (!node->ln_Pred) {
node = NULL;
}
return((VOID *)node);
}
/* Get next node of EXEC list entry */
VOID *
get_succ(struct Node *node)
{
node = node->ln_Succ;
/* end of list ? */
if (!node->ln_Succ) {
node = NULL;
}
return((VOID *)node);
}
/* Get previous node of EXEC list entry */
VOID *
get_pred(struct Node *node)
{
node = node->ln_Pred;
/* start of list ? */
if (!node->ln_Pred) {
node = NULL;
}
return((VOID *)node);
}
/* Get node from list by given number */
VOID *
get_node(struct List *list, USHORT num)
{
struct Node *node;
if (node = get_head(list)) {
while (num-- && (node = get_succ(node)));
}
return((VOID *)node);
}
/* Duplicate text string */
SHORT
duplicate_string(BYTE **ptr, BYTE *text)
{
LONG len;
SHORT status = EDITOR_STATUS_NORMAL;
if (!text || (len = strlen(text) + 1) == 1) {
*ptr = NULL;
} else {
if (!(*ptr = DosAllocMem(len))) {
status = EDITOR_ERROR_OUT_OF_MEM;
} else {
CopyMem(text, *ptr, len);
}
}
return(status);
}
/* Duplicate text list */
SHORT
duplicate_text_list(struct Template *old_tp, struct Template *new_tp)
{
struct Node *node;
SHORT status = EDITOR_STATUS_NORMAL;
NewList(&new_tp->tp_TextList);
for (node = get_head(&old_tp->tp_TextList); node &&
status == EDITOR_STATUS_NORMAL; node = get_succ(node)) {
status = add_template_text_list_entry(new_tp, node->ln_Name);
}
return(status);
}
/* Build template text list from given text array */
SHORT
build_template_text_list(struct Template *tp, BYTE **text_array)
{
BYTE *text;
SHORT status = EDITOR_STATUS_NORMAL;
NewList(&tp->tp_TextList);
for (text = *text_array; text && status == EDITOR_STATUS_NORMAL;
text = *++text_array) {
status = add_template_text_list_entry(tp, text);
}
if (status != EDITOR_STATUS_NORMAL) {
free_template_text_list(tp);
}
return(status);
}
/* Build text list entry */
struct Node *
build_text_list_entry(BYTE *text)
{
struct Node *node;
if (node = AllocMem((LONG)sizeof(struct Node), (LONG)MEMF_PUBLIC |
MEMF_CLEAR)) {
if (!(node->ln_Name = DosAllocMem((LONG)(strlen(text) + 1)))) {
FreeMem(node, (LONG)sizeof(struct Node));
node = NULL;
} else {
strcpy(node->ln_Name, text);
}
}
return(node);
}
/* Add text entry to template text list */
SHORT
add_template_text_list_entry(struct Template *tp, BYTE *text)
{
struct Node *node;
SHORT status = EDITOR_STATUS_NORMAL;
if (!(node = build_text_list_entry(text))) {
status = EDITOR_ERROR_OUT_OF_MEM;
} else {
AddTail(&tp->tp_TextList, node);
}
return(status);
}
/* Free template text list */
VOID
free_template_text_list(struct Template *tp)
{
struct List *list = &tp->tp_TextList;
struct Node *node;
while (node = RemTail(list)) {
free_text_list_entry(node);
}
}
/* Free text list entry */
VOID
free_text_list_entry(struct Node *node)
{
DosFreeMem(node->ln_Name);
FreeMem(node, (LONG)sizeof(struct Node));
}
/* Build template text array from template text list */
SHORT
build_template_text_array(struct Template *tp)
{
struct GadgetData *gd = &tp->tp_Data.tp_GadgetData;
struct List *list = &tp->tp_TextList;
struct Node *node;
BYTE **text_array;
USHORT count = 0;
SHORT status = EDITOR_STATUS_NORMAL;
/* Count entries in text list */
for (node = get_head(list); node; node = get_succ(node)) {
count++;
}
if (!(text_array = DosAllocMem((LONG)(count + 1) * sizeof(BYTE *)))) {
status = EDITOR_ERROR_OUT_OF_MEM;
} else {
switch (tp->tp_Type) {
case TEMPLATE_TYPE_MX :
gd->gd_SpecialData.gd_MXData.gd_MXTextArray = text_array;
break;
case TEMPLATE_TYPE_CYCLE :
gd->gd_SpecialData.gd_CycleData.gd_CycleTextArray = text_array;
break;
}
/* Fill text array with pointers to text list entries */
for (node = get_head(list); node && status == EDITOR_STATUS_NORMAL;
node = get_succ(node)) {
*text_array++ = node->ln_Name;
}
*text_array = NULL; /* mark end of text array */
}
return(status);
}
/* Free template text array */
VOID
free_template_text_array(struct Template *tp)
{
struct GadgetData *gd = &tp->tp_Data.tp_GadgetData;
BYTE **text_array;
switch (tp->tp_Type) {
case TEMPLATE_TYPE_MX :
text_array = gd->gd_SpecialData.gd_MXData.gd_MXTextArray;
gd->gd_SpecialData.gd_MXData.gd_MXTextArray = NULL;
break;
case TEMPLATE_TYPE_CYCLE :
text_array = gd->gd_SpecialData.gd_CycleData.gd_CycleTextArray;
gd->gd_SpecialData.gd_CycleData.gd_CycleTextArray = NULL;
break;
default :
text_array = NULL;
break;
}
DosFreeMem(text_array);
}
/* Open font with given attribute */
struct TextFont *
open_font(struct TextAttr *ta)
{
struct TextFont *tf;
tf = OpenFont(ta);
if (!tf || tf->tf_YSize != ta->ta_YSize) {
tf = OpenDiskFont(ta);
}
return(tf);
}
/* Close font */
VOID
close_font(struct TextFont *tf)
{
if (tf) {
CloseFont(tf);
}
}