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
/
save.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-09-22
|
7KB
|
264 lines
/*************************************
* *
* Editor v1.0 *
* by Torsten Jürgeleit in 08/91 *
* *
* Save part *
* *
*************************************/
/* Includes */
#include "includes.h"
#include "defines.h"
#include "imports.h"
#include "protos.h"
/* Save project */
SHORT
save_project(VOID)
{
struct TemplateList *tl = &template_list;
struct Template *tp;
struct FileRequester *freq = project_file_requester;
BPTR fh;
BYTE path[LONG_DSIZE + LONG_FSIZE + 1];
USHORT len;
SHORT status = EDITOR_STATUS_NORMAL;
/* Display ARP file requester and check if user selected cancel */
freq->fr_FuncFlags |= FRF_DoColor;
freq->fr_Hail = PROJECT_SAVE_HAIL_TEXT;
if (FileRequest(freq)) {
/* Prepare file name and project name */
len = strlen(freq->fr_File) - 4;
if (Strcmp(freq->fr_File + len, ".tpl")) {
strcpy(&tl->tl_ProjectName[0], freq->fr_File);
strcat(freq->fr_File, ".tpl");
} else {
strncpy(&tl->tl_ProjectName[0], freq->fr_File, (size_t)len);
tl->tl_ProjectName[len] = '\0';
}
/* Build full path for project file */
strcpy(&path[0], freq->fr_Dir);
TackOn(&path[0], freq->fr_File);
/* Check if file already exists and inform user */
if (fh = Open(&path[0], (LONG)MODE_OLDFILE)) {
Close(fh);
}
if (!fh || ok_cancel_requester(" Save ", "File already exists."
" Do you really want to overwrite?") == TRUE) {
/* Open file and write project header */
if (!(fh = Open(&path[0], (LONG)MODE_NEWFILE))) {
status = EDITOR_ERROR_OPEN_FAILED;
} else {
if ((status = write_project_header(fh)) == EDITOR_STATUS_NORMAL) {
/* Save all templates */
for (tp = get_head(&tl->tl_List); tp && status ==
EDITOR_STATUS_NORMAL; tp = get_succ(&tp->tp_Node)) {
status = write_template(fh, tp);
}
/* If any error then delete incomplete project file */
if (status != EDITOR_STATUS_NORMAL) {
DeleteFile(&path[0]);
} else {
tl->tl_Flags &= ~TEMPLATE_LIST_FLAG_CHANGED;
}
}
Close(fh);
}
}
}
if (status != EDITOR_STATUS_NORMAL) {
show_error(status);
}
return(status);
}
/* Write project header to save file */
STATIC SHORT
write_project_header(BPTR fh)
{
SHORT status;
if (FPrintf(fh,
"BEGIN PROJECTHEADER\n"
" LEFTEDGE=%d\n"
" TOPEDGE=%d\n"
" WIDTH=%d\n"
" HEIGHT=%d\n"
" FLAGS=%d\n"
"END PROJECTHEADER\n", pwin->LeftEdge, pwin->TopEdge,
pwin->Width, pwin->Height, template_list.tl_Flags) == -1L) {
status = EDITOR_ERROR_WRITE_FAILED;
} else {
status = EDITOR_STATUS_NORMAL;
}
return(status);
}
/* Write template data to save file */
STATIC SHORT
write_template(BPTR fh, struct Template *tp)
{
struct Box *box = &tp->tp_Box;
struct TextAttr *ta = &tp->tp_TextAttr;
struct BorderData *bd;
struct TextData *td;
struct GadgetData *gd;
struct Node *node;
BYTE *fmt;
UBYTE type = tp->tp_Type;
SHORT status = EDITOR_STATUS_NORMAL;
/* Write standard data */
if (FPrintf(fh,
"BEGIN TEMPLATE\n"
" NAME=\"%s\"\n"
" TYPE=%d\n"
" FLAGS=%d\n"
" BEGIN BOX\n"
" X1=%d\n"
" Y1=%d\n"
" X2=%d\n"
" Y2=%d\n"
" END BOX\n", &tp->tp_TemplateName[0], type,
tp->tp_Flags, box->bo_X1, box->bo_Y1, box->bo_X2,
box->bo_Y2) == -1L) {
status = EDITOR_ERROR_WRITE_FAILED;
} else {
/* Write text list if any */
if (type == TEMPLATE_TYPE_MX || type == TEMPLATE_TYPE_CYCLE ||
type == TEMPLATE_TYPE_LISTVIEW) {
if (FPrintf(fh, " BEGIN TEXTLIST\n") == -1L) {
status = EDITOR_ERROR_WRITE_FAILED;
} else {
for (node = get_head(&tp->tp_TextList); node &&
status == EDITOR_STATUS_NORMAL; node = get_succ(node)) {
if (FPrintf(fh, " TEXT=\"%s\"\n", node->ln_Name) == -1L) {
status = EDITOR_ERROR_WRITE_FAILED;
}
}
if (status == EDITOR_STATUS_NORMAL) {
if (FPrintf(fh, " END TEXTLIST\n") == -1L) {
status = EDITOR_ERROR_WRITE_FAILED;
}
}
}
}
/* Write template data */
if (status == EDITOR_STATUS_NORMAL) {
switch (TEMPLATE_GROUP(tp)) {
case TEMPLATE_GROUP_BORDER :
/* Write border data */
bd = &tp->tp_Data.tp_BorderData;
if (FPrintf(fh,
" BEGIN BORDERDATA\n"
" TYPE=%ld\n"
" END BORDERDATA\n", bd->bd_Type) == -1L) {
status = EDITOR_ERROR_WRITE_FAILED;
}
break;
case TEMPLATE_GROUP_TEXT :
/* Write text data */
td = &tp->tp_Data.tp_TextData;
if (td->td_Type == TEXT_DATA_TYPE_TEXT) {
fmt = " BEGIN TEXTATTR\n"
" NAME=\"%s\"\n"
" YSIZE=%d\n"
" STYLE=%d\n"
" FLAGS=%d\n"
" END TEXTATTR\n"
" BEGIN TEXTDATA\n"
" TYPE=%d\n"
" FLAGS=%d\n"
" TEXT=\"%s\"\n"
" END TEXTDATA\n";
} else {
fmt = " BEGIN TEXTATTR\n"
" NAME=\"%s\"\n"
" YSIZE=%d\n"
" STYLE=%d\n"
" FLAGS=%d\n"
" END TEXTATTR\n"
" BEGIN TEXTDATA\n"
" TYPE=%d\n"
" FLAGS=%d\n"
" TEXT=%ld\n"
" END TEXTDATA\n";
}
if (FPrintf(fh, fmt, ta->ta_Name, ta->ta_YSize, ta->ta_Style,
ta->ta_Flags, td->td_Type, td->td_Flags,
td->td_Text) == -1L) {
status = EDITOR_ERROR_WRITE_FAILED;
}
break;
case TEMPLATE_GROUP_GADGET :
/* Write gadget data */
gd = &tp->tp_Data.tp_GadgetData;
if (FPrintf(fh,
" BEGIN TEXTATTR\n"
" NAME=\"%s\"\n"
" YSIZE=%d\n"
" STYLE=%d\n"
" FLAGS=%d\n"
" END TEXTATTR\n"
" BEGIN GADGETDATA\n"
" TYPE=%ld\n"
" FLAGS=%ld\n", ta->ta_Name, ta->ta_YSize,
ta->ta_Style, ta->ta_Flags, gd->gd_Type,
gd->gd_Flags) == -1L) {
status = EDITOR_ERROR_WRITE_FAILED;
} else {
if (!gd->gd_Text) {
fmt = " TEXT=%ld\n";
} else {
fmt = " TEXT=\"%s\"\n";
}
if (FPrintf(fh, fmt, gd->gd_Text) == -1L) {
status = EDITOR_ERROR_WRITE_FAILED;
} else {
if (gd->gd_Type == GADGET_DATA_TYPE_STRING) {
fmt = " SPECIAL1=%ld\n"
" SPECIAL2=%ld\n"
" SPECIAL3=\"%s\"\n";
} else {
fmt = " SPECIAL1=%ld\n"
" SPECIAL2=%ld\n"
" SPECIAL3=%ld\n";
}
if (FPrintf(fh, fmt, gd->gd_SpecialData.gd_Data.gd_Data1,
gd->gd_SpecialData.gd_Data.gd_Data2,
gd->gd_SpecialData.gd_Data.gd_Data3) == -1L) {
status = EDITOR_ERROR_WRITE_FAILED;
} else {
if (FPrintf(fh, " END GADGETDATA\n") == -1L) {
status = EDITOR_ERROR_WRITE_FAILED;
}
}
}
}
break;
}
}
if (status == EDITOR_STATUS_NORMAL) {
if (FPrintf(fh, "END TEMPLATE\n") == -1L) {
status = EDITOR_ERROR_WRITE_FAILED;
}
}
}
return(status);
}