home *** CD-ROM | disk | FTP | other *** search
- /*
- #### # # # #
- # # # # # The FreeWare C library for
- # # ## ### # # # # ### RISC OS machines
- # # # # # # # # # # # ___________________________________
- # # #### ### ## # # # #
- # # # # # # # # # # Please refer to the accompanying
- #### ### #### # # ##### # ### documentation for conditions of use
- ________________________________________________________________________
-
- File: Template.Clone.c
- Author: Copyright © 1992 Jason Williams
- Thanks to John Winters for supplying the code that I hacked
- changed, hacked, rewrote, and then wrote again from scratch!
- Version: 1.11 (13 Jul 1993)
- Purpose: Loading, cacheing, and retrieval of window templates
- */
-
-
- #include "TempDefs.h"
-
-
-
- extern window_block *Template_Clone(char *name, int maxtitlesize)
- {
- template_record *t;
- window_block *window;
- int icon;
- icon_block *icons;
-
- t = Template__FindTemplate(name);
- if (t == NULL)
- return(NULL);
-
- window = (window_block *) malloc(sizeof(window_block) +
- (sizeof(icon_block) * t->windowdef->numicons));
- if (window == NULL)
- Error_ReportFatalInternal(ERR1, ERRMESS1);
-
- memcpy(window, t->windowdef, sizeof(window_block) +
- (sizeof(icon_block) * t->windowdef->numicons));
-
- if (window->titleflags.data.indirected)
- {
- if (maxtitlesize == template_TITLEMIN)
- maxtitlesize = window->title.indirecttext.bufflen;
- else if (maxtitlesize < 1)
- maxtitlesize = 260; /* default ind. title size */
-
- window->title.indirecttext.buffer = (char *) malloc(maxtitlesize);
- window->title.indirecttext.bufflen = maxtitlesize;
- if (window->title.indirecttext.buffer == NULL)
- Error_ReportFatalInternal(ERR1, ERRMESS1);
-
- strncpy(window->title.indirecttext.buffer,
- t->windowdef->title.indirecttext.buffer,
- window->title.indirecttext.bufflen-1);
- window->title.indirecttext.buffer[window->title.indirecttext.bufflen-1] =0;
- }
-
- icons = (icon_block *) ((int)window + sizeof(window_block));
- for (icon = 0; icon < t->windowdef->numicons; icon++)
- {
- if (icons[icon].flags.data.indirected && icons[icon].flags.data.text)
- {
- char *oldtext = icons[icon].data.indirecttext.buffer;
-
- icons[icon].data.indirecttext.buffer = (char *)
- malloc(icons[icon].data.indirecttext.bufflen);
- if (icons[icon].data.indirecttext.buffer == NULL)
- Error_ReportFatalInternal(ERR1, ERRMESS1);
-
- strncpy(icons[icon].data.indirecttext.buffer,
- oldtext, icons[icon].data.indirecttext.bufflen - 1);
- icons[icon].data.indirecttext.buffer[
- icons[icon].data.indirecttext.bufflen - 1] = 0;
-
- oldtext = icons[icon].data.indirecttext.validstring;
- if ((int)oldtext > 0)
- {
- int size;
-
- size = strlencr(oldtext);
- icons[icon].data.indirecttext.validstring = (char *) malloc(size + 1);
- if (icons[icon].data.indirecttext.validstring == NULL)
- Error_ReportFatalInternal(ERR1, ERRMESS1);
-
- strncpy(icons[icon].data.indirecttext.validstring, oldtext, size);
- icons[icon].data.indirecttext.validstring[size] = 0;
- }
- }
- }
-
- return(window);
- }
-