#include "Globals.h" #include "icon.h" WriteItemList(FileName,arexx) /*Write the item list to disk*/ char *FileName; BYTE arexx; { struct FileHandle *fp; struct LineItem *CurItem; char chip buffer[100]; if((fp=(struct FileHandle *)Open(FileName,MODE_NEWFILE))==NULL) { if(!arexx) TitleError("Can't open file for save!"); return(FALSE); } strcpy(buffer,"LDB3"); /*ID: Liner Data Block version 3*/ /*Store StartingLevel & double spacing flag as one byte on disk*/ /*(holdover from the old data format)*/ buffer[5]=StartingLevel+((prefs.DS) ? 32 : 0); Write(fp,buffer,6); /*Write out the header*/ CurItem=(struct LineItem *)FirstItem; do /*Write each LineItem to the file*/ { buffer[0]=strlen(CurItem->Text)+3; buffer[1]=CurItem->Level; buffer[2]=CurItem->ItemNumber; buffer[3]=CurItem->cont; strcpy(&buffer[4],CurItem->Text); Write(fp,buffer,buffer[0]+2); CurItem=(struct LineItem *)CurItem->NextItem; } while(CurItem != NULL); Close(fp); if(prefs.Icons) /*Create an icon?*/ PutDiskObject(FileName,&iconinfo); /*If so, write it out*/ return(TRUE); } extern void CreatePrefsIcon() /*Create an icon for liner.prefs*/ { if(prefs.Icons) PutDiskObject("liner:liner.prefs",&prefsiconinfo); } Old_ReadItemList(FileName,arexx) /*Read a pre V1.5 item list from disk*/ char *FileName; BYTE arexx; { struct FileHandle *fp; struct Old_LineItem chip buffer; struct LineItem *CurItem; int len; char TempIndent; char text[80]; if((fp=(struct FileHandle *)Open(FileName,MODE_OLDFILE))==NULL) { if(!arexx) TitleError("Can't open file for read!"); return(FALSE); } Read(fp,&buffer,sizeof(struct Old_LineItem)); TempIndent=buffer.Text[4]; buffer.Text[4]=NULL; if(strcmp(buffer.Text,"LFDB")) /*'Liner Format Data Block'*/ { Close(fp); return(FALSE); } FreeListMem(FirstItem,LastItem); /*Get rid of old outline*/ ModifyMenus(TempIndent); /*Modify the Double Spacing and Starting Level*/ /*menus according to file being read in*/ SetRowsInScreen(); /*Set the number of rows*/ CurItem=FirstItem=FirstScrnItem=(struct LineItem *)InsertItem(NULL,NULL); if(CurItem==NULL) { CloseGraphics(); CloseLibrary(IconBase); CloseLibrary(DosBase); Leave(100,"Memory too fragmented to continue!"); } len=Read(fp,&buffer,sizeof(struct Old_LineItem)); while(len > 0) /*While there is still data to be read,*/ { /*read it*/ struct LineItem *old; CurItem->ItemNumber=buffer.ItemNumber; CurItem->Level=buffer.Level; CurItem->cont=FALSE; strcpy(CurItem->Text,buffer.Text); len=Read(fp,&buffer,sizeof(struct Old_LineItem)); strcpy(text,CurItem->Text); CurItem=(struct LineItem *)BreakLineApart(CurItem,NULL,text); old=(struct LineItem *)CurItem; CurItem=(struct LineItem *)InsertItem(NULL,CurItem); if(CurItem==NULL) { LastItem=(struct LineItem *)old; NewAll(); Leave(0,"Memory too fragmented to perform OPEN!"); return(FALSE); } } LastItem=(struct LineItem *)CurItem->PrevItem; LastItem->NextItem=NULL; Close(fp); PrintItemList(FirstItem,1); CurrentItem=(struct LineItem *)FirstItem; FreeMem(CurItem,sizeof(struct LineItem)); PlotCursor(MinX(CurrentItem),1); return(TRUE); } ReadItemList(FileName,arexx) /*Read an item list from disk*/ char *FileName; BYTE arexx; { struct FileHandle *fp; struct LineItem *CurItem; char chip buffer[100]; int len; char TempIndent; if((fp=(struct FileHandle *)Open(FileName,MODE_OLDFILE))==NULL) { if(!arexx) TitleError("Can't open file for read!"); return(FALSE); } Read(fp,buffer,6); if(strcmp(buffer,"LDB3")) /*'Liner Data Block version 3'*/ { Close(fp); /*Try reading the old file format*/ return(Old_ReadItemList(FileName,arexx)); } TempIndent=buffer[5]; FreeListMem(FirstItem,LastItem); /*Get rid of old outline*/ ModifyMenus(TempIndent); /*Modify the Double Spacing and Starting Level*/ /*menus according to file being read in*/ SetRowsInScreen(); /*Set the number of rows*/ CurItem=FirstItem=FirstScrnItem=(struct LineItem *)InsertItem(NULL,NULL); if(CurItem==NULL) { CloseGraphics(); CloseLibrary(IconBase); CloseLibrary(DosBase); Leave(0,"Memory too fragmented to perform OPEN!"); exit(); } len=Read(fp,buffer,1); while(len > 0 ) /*While information is there*/ { struct LineItem *old; Read(fp,buffer,buffer[0]+1); CurItem->Level=buffer[0]; /*Put it into a LineItem*/ CurItem->ItemNumber=buffer[1]; CurItem->cont=buffer[2]; strcpy(CurItem->Text,&buffer[3]); len=Read(fp,buffer,1); old=(struct LineItem *)CurItem; CurItem=(struct LineItem *)InsertItem(NULL,CurItem); if(CurItem==NULL) /*Out of memory*/ { LastItem=(struct LineItem *)old; NewAll(); Leave(0,"Memory too fragmented to perform OPEN!"); return(FALSE); } } LastItem=(struct LineItem *)CurItem->PrevItem; LastItem->NextItem=NULL; /*Delete the last LineItem*/ FreeMem(CurItem,sizeof(struct LineItem)); Close(fp); PrintItemList(FirstItem,1); /*Print the new outline*/ CurrentItem=(struct LineItem *)FirstItem; /*Put the cursor*/ PlotCursor(MinX(CurrentItem),1); /*at the top*/ return(TRUE); } /*This function deals with the situation of having a line longer than*/ /*is currently supported for its level (the line lengths were shortened*/ /*slightly from 1.32 to 2.00). This function puts any extra text onto a*/ /*continuation line that it tacks on after the too-long line. It will*/ /*copy whole words if it can find them. If the offending line has no*/ /*spaces, then it will be chopped into two pieces. No data is lost*/ struct LineItem *BreakLineApart(Item,Next,text) struct LineItem *Item,*Next; char *text; { BYTE len,c,max; struct LineItem *cont; len=(strlen(text)); max=MaxLen(Item->Level); if(len>max) /*Checks to see if the line is too big. This way, it*/ { /*can be used as a check by the calling function.*/ cont=(struct LineItem *)InsertItem(Next,Item); if(cont==NULL) { Leave(0,"Memory too fragmented to perform operation!"); return(Item); } cont->cont=TRUE; cont->ItemNumber=Item->ItemNumber; cont->Level=Item->Level; /*Search for a space (breaking apart on a word to make it*/ /*look nice)*/ for(c=max;c>=len-max && text[c]!=' ';--c); if(c>=len-max && text[c]==' ') { /*Found a space, so break the line apart there*/ strcpy(cont->Text,&text[c+1]); text[c]=NULL; } else /*Otherwise, chop the line in two*/ { strcpy(cont->Text,&text[max]); text[max]=NULL; } strcpy(Item->Text,text); return(cont); } strcpy(Item->Text,text); return(Item); } /*End of disk.c*/