diff options
Diffstat (limited to 'mcon.c')
-rw-r--r-- | mcon.c | 1670 |
1 files changed, 1670 insertions, 0 deletions
@@ -0,0 +1,1670 @@ +/* + File: mcon.c + Written by: John van Groningen +*/ + +#define MACOSX +#define NEW_HEADERS +#define G_POWER +#define FLUSH_PORT_BUFFER + +#ifdef MACHO +# define NEWLINE_CHAR '\r' +#else +# define NEWLINE_CHAR '\n' +#endif + +#ifdef NEW_HEADERS +# define TARGET_API_MAC_CARBON 1 +#endif + +#ifndef NEW_HEADERS +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#else +# ifndef MACHO +extern void sprintf (char *,...); +# endif +#endif + +#define MULW(a,b) ((int)((short)(a)*(short)(b))) +#define UDIVW(a,b) ((unsigned short)((unsigned short)(a)/(unsigned short)(b))) + +#include <quickdraw.h> +#include <fonts.h> +#include <events.h> +#include <windows.h> +#ifndef NEW_HEADERS +# include <desk.h> +#endif +#include <memory.h> +#include <resources.h> +#include <menus.h> +#include <OSUtils.h> +#ifndef NEW_HEADERS +# include <OSEvents.h> +#endif + +#ifdef MACOSX +# undef GetWindowPort +#endif + +#undef PARALLEL +#undef SIMULATE +#undef COMMUNICATION + +#include "mcon.h" +#ifdef COMMUNICATION +# include "mcom.h" +#endif + +#ifdef G_POWER +void first_function (void) +{ +} +#endif + +extern void *abc_main(); + +extern void add_IO_time(),add_execute_time(); + +#define CONSOLE_WINDOW_ID 128 +#define ERROR_WINDOW_ID 129 + +static int cur_y,cur_x; +static int g_cur_x; +static int n_screen_lines; + +static int e_cur_y,e_cur_x; +static int e_g_cur_x; +static int n_e_screen_lines; + +static int char_height,char_ascent,char_descent,char_leading,char_asc_lead; + +#define MAX_N_COLUMNS 160 + +typedef char SCREEN_LINE_CHARS [MAX_N_COLUMNS+1]; +static SCREEN_LINE_CHARS *screen_chars,*e_screen_chars; + +static char *input_buffer; +static int input_buffer_pos,input_buffer_length; + +static WindowPtr c_window,e_window; + +static int error_window_visible; +static int console_window_visible; + +static EventRecord my_event; + +static void update_window (WindowPtr window,SCREEN_LINE_CHARS *chars,int n_lines,int g_cur_x,int cur_y) +{ + int y,screen_y_pos; + GrafPtr old_port; + + BeginUpdate (window); + GetPort(&old_port); + +#ifdef MACOSX + SetPort (GetWindowPort (window)); + { + RgnHandle visible_region; + + visible_region=NewRgn(); + GetPortVisibleRegion (GetWindowPort (window),visible_region); + EraseRgn (visible_region); + DisposeRgn (visible_region); + } +#else + SetPort (window); + EraseRgn (window->visRgn); +#endif + + for (y=0,screen_y_pos=char_asc_lead; y<n_lines; ++y,screen_y_pos+=char_height){ + char *line_chars,*c_p; + int line_length; + + MoveTo (0,screen_y_pos); + line_chars=chars[y]; + + line_length=0; + c_p=line_chars; + while (*c_p++!=NEWLINE_CHAR) + ++line_length; + DrawText (line_chars,0,line_length); + } + + MoveTo (g_cur_x,MULW (cur_y,char_height)+char_asc_lead); + + SetPort (old_port); + EndUpdate (window); +} + +static void select_window (WindowPtr window) +{ + if (window!=c_window && window!=e_window) + return; + + SelectWindow (window); +} + +static int c_window_width,c_window_height,e_window_width,e_window_height; + +static Rect c_window_rect,e_window_rect; +static Rect c_local_window_rect,e_local_window_rect; + +static void scroll_window (WindowPtr window,SCREEN_LINE_CHARS *chars,int n_lines) +{ + RgnHandle erase_region; +#ifdef MACOSX + Rect rect; +#endif + + add_execute_time(); + + erase_region=NewRgn(); + +#ifdef MACOSX + GetPortBounds (GetWindowPort (window),&rect); + ScrollRect (&rect,0,-char_height,erase_region); +#else + ScrollRect (&window->portRect,0,-char_height,erase_region); +#endif + + EraseRgn (erase_region); + DisposeRgn (erase_region); + + BlockMove ((char*)chars[1],(char*)chars,(MAX_N_COLUMNS+1)*(n_lines-1)); + chars[n_lines-1][0]=NEWLINE_CHAR; + +#ifdef FLUSH_PORT_BUFFER + QDFlushPortBuffer (GetWindowPort (window),NULL); +#endif + + add_IO_time(); +} + +static void print_newline() +{ + screen_chars[cur_y][cur_x]=NEWLINE_CHAR; + ++cur_y; + cur_x=0; + g_cur_x=0; + if (cur_y>=n_screen_lines){ + cur_y=n_screen_lines-1; + scroll_window (c_window,screen_chars,n_screen_lines); + } +#ifdef FLUSH_PORT_BUFFER + else + QDFlushPortBuffer (GetWindowPort (c_window),NULL); +#endif + MoveTo (0,MULW(cur_y,char_height)+char_asc_lead); +} + +static void window_print_char (char c) +{ + if (c==NEWLINE_CHAR) + print_newline(); + else { + char *screen_char; + int w; + + w=CharWidth (c); + if (g_cur_x+w>=c_window_width || cur_x+1>=MAX_N_COLUMNS) + print_newline(); + g_cur_x+=w; + + screen_char=&screen_chars[cur_y][cur_x]; + *screen_char=c; + screen_char[1]=NEWLINE_CHAR; + DrawChar (c); + ++cur_x; + } +} + +static void make_error_window_visible () +{ + if (!error_window_visible){ + add_execute_time(); + ShowWindow (e_window); +#ifdef MACOSX + ValidWindowRect (e_window,&e_local_window_rect); +#else + ValidRect (&e_local_window_rect); +#endif + add_IO_time(); + error_window_visible=1; + } +} + +static void make_console_window_visible () +{ + if (!console_window_visible){ + add_execute_time(); + + ShowWindow (c_window); + +#ifdef MACOSX + ValidWindowRect (c_window,&c_local_window_rect); +#else + ValidRect (&c_local_window_rect); +#endif + add_IO_time(); + console_window_visible=1; + } +} + +/* + #ifdef powerc + QDGlobals qd; + #endif +**/ + +#ifndef MACOSX + +#ifdef NO_INIT +extern QDGlobals qd; +#else +QDGlobals qd; +#endif + +#endif + +void w_print_char (char c) +{ + GrafPtr port; + +#ifdef MACOSX + GetPort (&port); + SetPort (GetWindowPort (c_window)); +#else + port=NULL; + if (qd.thePort!=c_window){ + port=qd.thePort; + SetPort (c_window); + } +#endif + + if (!console_window_visible) + make_console_window_visible(); + + window_print_char (c); + +#ifndef MACOSX + if (port!=NULL) +#endif + SetPort (port); +} + +static void w_print_text_without_newlines (char *s,unsigned long length) +{ + unsigned long text_length,n; + + text_length=TextWidth (s,0,length); + if (g_cur_x+text_length<c_window_width && cur_x+length<MAX_N_COLUMNS){ + char *screen_char; + int n; + + screen_char=&screen_chars[cur_y][cur_x]; + for (n=0; n<length; ++n) + *screen_char++=s[n]; + *screen_char=NEWLINE_CHAR; + DrawText (s,0,length); + g_cur_x+=text_length; + cur_x+=length; + } else + for (n=0; n<length; ++n) + window_print_char (s[n]); +} + +void w_print_text (char *s,unsigned long length) +{ + char *end_s,c; + GrafPtr port; + +#ifdef MACOSX + GetPort (&port); + SetPort (GetWindowPort (c_window)); +#else + port=NULL; + if (qd.thePort!=c_window){ + port=qd.thePort; + SetPort (c_window); + } +#endif + + if (!console_window_visible) + make_console_window_visible(); + + end_s=s; + while (length!=0){ + while (length!=0 && (c=*end_s,c!=NEWLINE_CHAR)){ + ++end_s; + --length; + } + w_print_text_without_newlines (s,end_s-s); + if (length==0) + return; + print_newline(); + --length; + s=++end_s; + } + +#ifndef MACOSX + if (port!=NULL) +#endif + SetPort (port); +} + +static void e_print_newline() +{ + e_screen_chars[e_cur_y][e_cur_x]=NEWLINE_CHAR; + ++e_cur_y; + e_cur_x=0; + e_g_cur_x=0; + if (e_cur_y>=n_e_screen_lines){ + e_cur_y=n_e_screen_lines-1; + scroll_window (e_window,e_screen_chars,n_e_screen_lines); + } +#ifdef FLUSH_PORT_BUFFER + else + QDFlushPortBuffer (GetWindowPort (e_window),NULL); +#endif + MoveTo (0,MULW(e_cur_y,char_height)+char_asc_lead); +} + +static void e_print_char (char c) +{ + if (c==NEWLINE_CHAR) + e_print_newline(); + else { + char *screen_char; + int w; + + w=CharWidth (c); + if (e_g_cur_x+w>=e_window_width || e_cur_x+1>=MAX_N_COLUMNS) + e_print_newline(); + e_g_cur_x+=w; + + screen_char=&e_screen_chars[e_cur_y][e_cur_x]; + *screen_char=c; + screen_char[1]=NEWLINE_CHAR; + DrawChar (c); + ++e_cur_x; + } +} + +void ew_print_char (char c) +{ + GrafPtr port; + +#ifdef MACOSX + GetPort (&port); + SetPort (GetWindowPort (e_window)); +#else + port=NULL; + if (qd.thePort!=e_window){ + port=qd.thePort; + SetPort (e_window); + } +#endif + + if (!error_window_visible) + make_error_window_visible(); + + e_print_char (c); + +#ifndef MACOSX + if (port!=NULL) +#endif + SetPort (port); +} + +static void e_print_text_without_newlines (char *s,unsigned long length) +{ + unsigned long text_length,n; + + text_length=TextWidth (s,0,length); + if (e_g_cur_x+text_length<e_window_width && e_cur_x+length<MAX_N_COLUMNS){ + char *screen_char; + int n; + + screen_char=&e_screen_chars[e_cur_y][e_cur_x]; + for (n=0; n<length; ++n) + *screen_char++=s[n]; + *screen_char=NEWLINE_CHAR; + DrawText (s,0,length); + e_g_cur_x+=text_length; + e_cur_x+=length; + } else + for (n=0; n<length; ++n) + e_print_char (s[n]); +} + +static void e_print_text (char *s,unsigned long length) +{ + char *end_s,c; + + end_s=s; + while (length!=0){ + while (length!=0 && (c=*end_s,c!=NEWLINE_CHAR)){ + ++end_s; + --length; + } + e_print_text_without_newlines (s,end_s-s); + if (length==0) + return; + e_print_newline(); + --length; + s=++end_s; + } +} + +void ew_print_text (char *s,unsigned long length) +{ + GrafPtr port; + +#ifdef MACOSX + GetPort (&port); + SetPort (GetWindowPort (e_window)); +#else + port=NULL; + if (qd.thePort!=e_window){ + port=qd.thePort; + SetPort (e_window); + } +#endif + + if (!error_window_visible) + make_error_window_visible(); + + e_print_text (s,length); + +#ifndef MACOSX + if (port!=NULL) +#endif + SetPort (port); +} + +static void w_show_cursor() +{ + int y; + + y=MULW(cur_y,char_height); + MoveTo (g_cur_x,y+char_height); + LineTo (g_cur_x,y+1); + MoveTo (g_cur_x,y+char_asc_lead); +} + +static void w_remove_cursor() +{ + PenMode (patBic); + w_show_cursor(); + PenMode (patCopy); +} + +static void w_remove_char (int w) +{ + Rect r; + int y; + + y=MULW(cur_y,char_height); + + r.bottom=y+char_height; + r.top=y+1; + r.left=g_cur_x; + r.right=g_cur_x+w-1; + + EraseRect (&r); +} + +void handle_update_or_mouse_down_event (EventRecord *event_p) +{ + if (event_p->what==updateEvt){ + if ((WindowPtr)event_p->message==c_window){ + w_remove_cursor(); + update_window (c_window,screen_chars,n_screen_lines,g_cur_x,cur_y); + w_show_cursor(); + } else if ((WindowPtr)event_p->message==e_window) + update_window (e_window,e_screen_chars,n_e_screen_lines,e_g_cur_x,e_cur_y); + } else if (event_p->what==mouseDown){ + WindowPtr window; + + if (FindWindow (event_p->where,&window)==inContent) + select_window (window); + } +} + +static int w_read_char() +{ + add_execute_time(); + + while (1){ +#ifndef MACOSX + SystemTask(); +#endif + if (!GetNextEvent (everyEvent,&my_event)) + continue; + switch (my_event.what){ + case keyDown: + case autoKey: + { + int c; + + c=my_event.message & 0xff; + + add_IO_time(); + + return c; + } + case updateEvt: + case mouseDown: + handle_update_or_mouse_down_event (&my_event); + break; + } + } +} + +static void w_read_line() +{ + int b_cur_x,b_cur_y,n_chars_read,c; + + n_chars_read=0; + b_cur_x=cur_x; + b_cur_y=cur_y; + + do { + w_show_cursor(); + c=w_read_char(); + w_remove_cursor(); + if (c=='\b'){ + if (n_chars_read>0){ + while (cur_x==0){ + int line_length,x,c; + char *screen_line; + + --cur_y; + screen_line=screen_chars[cur_y]; + + line_length=0; + x=0; + while (c=screen_line[line_length],c!=NEWLINE_CHAR){ + ++line_length; + x+=CharWidth (c); + } + cur_x=line_length; + g_cur_x=x; + } + if (cur_x>0){ + int w; + char *screen_char; + + --cur_x; + screen_char=&screen_chars[cur_y][cur_x]; + w=CharWidth (*screen_char); + *screen_char=NEWLINE_CHAR; + g_cur_x-=w; + --n_chars_read; + w_remove_char (w); + } + } + } else { + if (c==NEWLINE_CHAR){ + if (cur_y+1<n_screen_lines) + print_newline(); + else + if (b_cur_y>0){ + --b_cur_y; + print_newline(); + } + } else { + char *screen_char; + int w; + + w=CharWidth (c); + if (g_cur_x+w>=c_window_width || cur_x+1>=MAX_N_COLUMNS) + if (cur_y+1<n_screen_lines) + print_newline(); + else + if (b_cur_y>0){ + --b_cur_y; + print_newline(); + } else + continue; + g_cur_x+=w; + + screen_char=&screen_chars[cur_y][cur_x]; + *screen_char=c; + screen_char[1]=NEWLINE_CHAR; + DrawChar (c); + ++cur_x; + ++n_chars_read; + } + } + } while (c!=NEWLINE_CHAR); + + { + char *char_p,*screen_p; + + input_buffer_length=n_chars_read+1; + input_buffer_pos=0; + + char_p=input_buffer; + screen_p=&screen_chars[b_cur_y][b_cur_x]; + while (n_chars_read!=0){ + int c; + + while (c=*screen_p++,c==NEWLINE_CHAR){ + ++b_cur_y; + screen_p=screen_chars[b_cur_y]; + } + *char_p++=c; + --n_chars_read; + } + *char_p++=NEWLINE_CHAR; + } +} + +int w_get_char() +{ + int c; + + if (input_buffer_length==0){ + GrafPtr port; + +#ifdef MACOSX + GetPort (&port); + SetPort (GetWindowPort (c_window)); +#else + port=NULL; + if (qd.thePort!=c_window){ + port=qd.thePort; + SetPort (c_window); + } +#endif + + if (!console_window_visible) + make_console_window_visible(); + + w_read_line(); + +#ifndef MACOSX + if (port!=NULL) +#endif + SetPort (port); + } + + c=input_buffer[input_buffer_pos] & 0xff; + ++input_buffer_pos; + --input_buffer_length; + + return c; +} + +#define is_digit(n) ((unsigned)((n)-'0')<(unsigned)10) + +int w_get_int (int *i_p) +{ + int c,negative; + unsigned int i; + + c=w_get_char(); + while (c==' ' || c=='\t' || c==NEWLINE_CHAR) + c=w_get_char(); + + negative=0; + if (c=='+') + c=w_get_char(); + else + if (c=='-'){ + c=w_get_char(); + negative=1; + } + + if (!is_digit (c)){ + --input_buffer_pos; + ++input_buffer_length; + + *i_p=0; + return 0; + } + + i=c-'0'; + while (c=w_get_char(),is_digit (c)){ + i+=i<<2; + i+=i; + i+=c-'0'; + }; + + if (negative) + i=-i; + + --input_buffer_pos; + ++input_buffer_length; + + *i_p=i; + return -1; +} + +int w_get_real (double *r_p) +{ + char s[256+1]; + int c,dot,digits,result,n; + + n=0; + + c=w_get_char(); + while (c==' ' || c=='\t' || c==NEWLINE_CHAR) + c=w_get_char(); + + if (c=='+') + c=w_get_char(); + else + if (c=='-'){ + s[n++]=c; + c=w_get_char(); + } + + dot=0; + digits=0; + + while (is_digit (c) || c=='.'){ + if (c=='.'){ + if (dot){ + dot=2; + break; + } + dot=1; + } else + digits=-1; + if (n<256) + s[n++]=c; + c=w_get_char(); + } + + result=0; + if (digits) + if (dot==2 || ! (c=='e' || c=='E')) + result=-1; + else { + if (n<256) + s[n++]=c; + c=w_get_char(); + + if (c=='+') + c=w_get_char(); + else + if (c=='-'){ + if (n<256) + s[n++]=c; + c=w_get_char(); + } + + if (is_digit (c)){ + do { + if (n<256) + s[n++]=c; + c=w_get_char(); + } while (is_digit (c)); + + result=-1; + } + } + + if (n>=256) + result=0; + + --input_buffer_pos; + ++input_buffer_length; + + *r_p=0.0; + + if (result){ + s[n]='\0'; + +#if !defined (G_POWER) + result=convert_string_to_real (s,r_p); +#else + if (sscanf (s,"%lg",r_p)!=1) + result=0; +#endif + } + + return result; +} + +unsigned long w_get_text (char *string,unsigned long max_length) +{ + unsigned long length,l; + char *sp,*dp; + GrafPtr port; + +#ifdef MACOSX + GetPort (&port); + SetPort (GetWindowPort (c_window)); +#else + port=NULL; + if (qd.thePort!=c_window){ + port=qd.thePort; + SetPort (c_window); + } +#endif + + if (!console_window_visible) + make_console_window_visible(); + + if (input_buffer_length==0) + w_read_line(); + length=input_buffer_length; + if (length>max_length) + length=max_length; + + for (l=length,sp=&input_buffer[input_buffer_pos],dp=string; l!=0; --l) + *dp++=*sp++; + + input_buffer_pos+=length; + input_buffer_length-=length; + +#ifndef MACOSX + if (port!=NULL) +#endif + SetPort (port); + + return length; +} + +void w_print_string (char *s) +{ + char *end_s,c; + GrafPtr port; + +#ifdef MACOSX + GetPort (&port); + SetPort (GetWindowPort (c_window)); +#else + port=NULL; + if (qd.thePort!=c_window){ + port=qd.thePort; + SetPort (c_window); + } +#endif + + if (!console_window_visible) + make_console_window_visible(); + + end_s=s; + while (*s!='\0'){ + while (c=*end_s,c!='\0' && c!=NEWLINE_CHAR) + ++end_s; + w_print_text_without_newlines (s,end_s-s); + if (*end_s=='\0') + break; + print_newline(); + s=++end_s; + } + +#ifndef MACOSX + if (port!=NULL) +#endif + SetPort (port); +} + +void ew_print_string (char *s) +{ + char *end_s,c; + GrafPtr port; + +#ifdef MACOSX + GetPort (&port); + SetPort (GetWindowPort (e_window)); +#else + port=NULL; + if (qd.thePort!=e_window){ + port=qd.thePort; + SetPort (e_window); + } +#endif + + if (!error_window_visible) + make_error_window_visible(); + + end_s=s; + while (*s!='\0'){ + while (c=*end_s,c!='\0' && c!=NEWLINE_CHAR) + ++end_s; + e_print_text_without_newlines (s,end_s-s); + if (*end_s=='\0') + break; + e_print_newline(); + s=++end_s; + } + +#ifndef MACOSX + if (port!=NULL) +#endif + SetPort (port); +} + +#if !defined (G_POWER) +extern char *convert_int_to_string (char *string,int i); +extern char *convert_real_to_string (char *string,double *r_p); +extern int convert_string_to_real (char *string,double *r_p); +#endif + +void w_print_int (int n) +{ + char int_string [32]; + GrafPtr port; + +#ifdef MACOSX + GetPort (&port); + SetPort (GetWindowPort (c_window)); +#else + port=NULL; + if (qd.thePort!=c_window){ + port=qd.thePort; + SetPort (c_window); + } +#endif + + if (!console_window_visible) + make_console_window_visible(); + +#if !defined (G_POWER) + { + char *end_p; + + end_p=convert_int_to_string (int_string,n); + w_print_text_without_newlines (int_string,end_p-int_string); + } +#else + sprintf (int_string,"%d",n); + { + int string_length; + char *p; + + string_length=0; + for (p=int_string; *p; ++p) + ++string_length; + + w_print_text_without_newlines (int_string,string_length); + } +#endif + +#ifndef MACOSX + if (port!=NULL) +#endif + SetPort (port); +} + +void ew_print_int (int n) +{ + char int_string [32]; + GrafPtr port; + +#ifdef MACOSX + GetPort (&port); + SetPort (GetWindowPort (e_window)); +#else + port=NULL; + if (qd.thePort!=e_window){ + port=qd.thePort; + SetPort (e_window); + } +#endif + + if (!error_window_visible) + make_error_window_visible(); + +#if !defined (G_POWER) + { + char *end_p; + + end_p=convert_int_to_string (int_string,n); + e_print_text_without_newlines (int_string,end_p-int_string); + } +#else + sprintf (int_string,"%d",n); + { + int string_length; + char *p; + + string_length=0; + for (p=int_string; *p; ++p) + ++string_length; + + e_print_text_without_newlines (int_string,string_length); + } +#endif + +#ifndef MACOSX + if (port!=NULL) +#endif + SetPort (port); +} + +void w_print_real (double r) +{ + char real_string [40]; + GrafPtr port; + +#ifdef MACOSX + GetPort (&port); + SetPort (GetWindowPort (c_window)); +#else + port=NULL; + if (qd.thePort!=c_window){ + port=qd.thePort; + SetPort (c_window); + } +#endif + + if (!console_window_visible) + make_console_window_visible(); + +#if !defined (G_POWER) + { + char *end_p; + + end_p=convert_real_to_string (real_string,&r); + w_print_text_without_newlines (real_string,end_p-real_string); + } +#else + sprintf (real_string,"%.15g",r); + { + int string_length; + char *p; + + string_length=0; + for (p=real_string; *p; ++p) + ++string_length; + + w_print_text_without_newlines (real_string,string_length); + } +#endif + +#ifndef MACOSX + if (port!=NULL) +#endif + SetPort (port); +} + +void ew_print_real (double r) +{ + char real_string [40]; + GrafPtr port; + +#ifdef MACOSX + GetPort (&port); + SetPort (GetWindowPort (e_window)); +#else + port=NULL; + if (qd.thePort!=e_window){ + port=qd.thePort; + SetPort (e_window); + } +#endif + + if (!error_window_visible) + make_error_window_visible(); + +#if !defined (G_POWER) + { + char *end_p; + + end_p=convert_real_to_string (real_string,&r); + e_print_text_without_newlines (real_string,end_p-real_string); + } +#else + sprintf (real_string,"%.15g",r); + { + int string_length; + char *p; + + string_length=0; + for (p=real_string; *p; ++p) + ++string_length; + + e_print_text_without_newlines (real_string,string_length); + } +#endif + +#ifndef MACOSX + if (port!=NULL) +#endif + SetPort (port); +} + +static FontInfo font_info; +static short font_id,font_size; + +long stack_size,heap_size,flags; +#ifdef WRITE_HEAP +long min_write_heap_size=0; +#endif; +#ifdef G_POWER +long heap_size_multiple; +long initial_heap_size; +#endif + +static int init_terminal() +{ + int n; + int screen_top,screen_left,screen_bottom,screen_right; + int screen_width,screen_height,left_right_free,top_bottom_free; + + int three,ten; + +#ifndef NO_INIT +# ifndef MACOSX + InitGraf (&qd.thePort); + InitFonts(); +# endif + FlushEvents (everyEvent,0); +# ifndef MACOSX + InitWindows(); +# endif + InitCursor(); +# ifndef MACOSX + InitMenus(); +# endif +#endif + + three=3; ten=10; /* to get a divw instead of a divl */ + +#ifdef MACOSX + { + BitMap bit_map; + + GetQDGlobalsScreenBits (&bit_map); + + screen_top=bit_map.bounds.top; + screen_left=bit_map.bounds.left; + screen_bottom=bit_map.bounds.bottom; + screen_right=bit_map.bounds.right; + } +#else + screen_top=qd.thePort->portRect.top; + screen_left=qd.thePort->portRect.left; + screen_bottom=qd.thePort->portRect.bottom; + screen_right=qd.thePort->portRect.right; +#endif + + screen_top+=15; /* menu bar height */ + + screen_width=screen_right-screen_left+1; + screen_height=screen_bottom-screen_top+1; + + left_right_free=UDIVW (screen_width>>2,three); /* /12 */ + top_bottom_free=12; + + c_window_rect.left=screen_left+left_right_free; + c_window_rect.right=screen_right-left_right_free; + + c_window_rect.top=screen_top+20+top_bottom_free; + c_window_rect.bottom=screen_top+UDIVW (screen_height*7,ten)-6; + + c_local_window_rect.left=0; + c_local_window_rect.right=c_window_rect.right-c_window_rect.left; + + c_local_window_rect.top=0; + c_local_window_rect.bottom=c_window_rect.bottom-c_window_rect.top; + + e_window_rect.left=screen_left+left_right_free; + e_window_rect.right=screen_right-left_right_free; + + e_window_rect.top=screen_top+20+UDIVW (screen_height*7,ten)+6; + e_window_rect.bottom=screen_bottom-top_bottom_free; + + e_local_window_rect.left=0; + e_local_window_rect.right=e_window_rect.right-e_window_rect.left; + + e_local_window_rect.top=0; + e_local_window_rect.bottom=e_window_rect.bottom-e_window_rect.top; + + c_window_width=c_window_rect.right-c_window_rect.left+1; + c_window_height=c_window_rect.bottom-c_window_rect.top+1; + + e_window_width=c_window_rect.right-e_window_rect.left+1; + e_window_height=e_window_rect.bottom-e_window_rect.top+1; + + error_window_visible=0; + + console_window_visible=flags & 16 ? 0 : 1; + + c_window=NewWindow (NULL,&c_window_rect,"\pConsole",console_window_visible,0,(WindowPtr)-1,0,CONSOLE_WINDOW_ID); + if (c_window==NULL) + return 0; + + e_window=NewWindow (NULL,&e_window_rect,"\pMessages",0,0,(WindowPtr)-1,0,ERROR_WINDOW_ID); + if (e_window==NULL) + return 0; + +#ifdef MACOSX + SetPort (GetWindowPort (e_window)); +#else + SetPort (e_window); +#endif + TextFont (font_id); + TextSize (font_size); + + GetFontInfo (&font_info); + char_ascent=font_info.ascent; + char_descent=font_info.descent; + char_leading=font_info.leading; + char_asc_lead=char_ascent+char_leading; + char_height=char_asc_lead+char_descent; + + e_cur_y=0; + e_cur_x=0; + e_g_cur_x=0; + n_e_screen_lines=UDIVW (e_window_height,char_height); + + MoveTo (0,char_asc_lead); + +#ifdef MACOSX + SetPort (GetWindowPort (c_window)); +#else + SetPort (c_window); +#endif + + TextFont (font_id); + TextSize (font_size); + + cur_y=0; + cur_x=0; + g_cur_x=0; + n_screen_lines=UDIVW (c_window_height,char_height); + + MoveTo (0,char_asc_lead); + + if (console_window_visible){ + SelectWindow (c_window); +#ifdef MACOSX + ValidWindowRect (c_window,&c_local_window_rect); +#else + ValidRect (&c_local_window_rect); +#endif +} + + screen_chars=(SCREEN_LINE_CHARS*) NewPtr (n_screen_lines * (MAX_N_COLUMNS+1)); + if (screen_chars==NULL) + return 0; + + for (n=0; n<n_screen_lines; ++n) + screen_chars[n][0]=NEWLINE_CHAR; + + e_screen_chars=(SCREEN_LINE_CHARS*) NewPtr (n_e_screen_lines * (MAX_N_COLUMNS+1)); + if (e_screen_chars==NULL) + return 0; + + for (n=0; n<n_e_screen_lines; ++n) + e_screen_chars[n][0]=NEWLINE_CHAR; + + input_buffer=(char*) NewPtr (n_screen_lines * MAX_N_COLUMNS+1); + if (input_buffer==NULL) + return 0; + + input_buffer_length=0; + + return 1; +} + +static void wait_key() +{ + while (1){ +#ifndef MACOSX + SystemTask(); +#endif + if (!GetNextEvent (everyEvent,&my_event)) + continue; + switch (my_event.what){ + case keyDown: + return; + case updateEvt: + case mouseDown: + handle_update_or_mouse_down_event (&my_event); + break; + } + } +} + +#define VOID void + +void wait_for_key_press (VOID) +{ +#if 1 + SetWTitle (flags & 16 ? e_window : c_window,"\ppress any key to exit"); +#endif + wait_key(); +} + +static void exit_terminal() +{ + DisposeWindow (c_window); + DisposeWindow (e_window); +/* + CloseWindow (c_window); + CloseWindow (e_window); +*/ +} + +static void get_font_number (char *font_name) +{ + char system_font_name[256]; + + GetFNum ((unsigned char*)font_name,&font_id); + + if (font_id==0){ + char *s1,*s2; + + GetFontName (0,(unsigned char*)system_font_name); + + s1=system_font_name; + s2=font_name; + while (*s1==*s2 && *s1!='\0'){ + ++s1; + ++s2; + } + if (*s1 || *s2) + font_id=-1; + } +} + +#ifdef PARALLEL +void load_code_segments (VOID) +{ + int n_code_resources,resource_number; + + n_code_resources=Count1Resources ('CODE'); + + for (resource_number=1; resource_number<=n_code_resources; ++resource_number){ + Handle resource; + + SetResLoad (1); + + resource=Get1Resource ('CODE',resource_number); + if (resource!=NULL && !ResError()){ + MoveHHi (resource); + HLock (resource); + } + } +} +#endif + +#ifndef G_POWER + extern int target_processor; +#endif + +#ifdef SIMULATE + extern int n_processors,processor_table_size; + extern int processor_table,end_processor_table; +#endif + +SysEnvRec system_environment; +int wait_next_event_available; + +#include <types.h> + +#ifndef powerc +#pragma parameter __D0 MySysEnvirons (__D0, __A0) +extern pascal OSErr MySysEnvirons(short versionRequested, SysEnvRec *theWorld) + ONEWORDINLINE(0xA090); +#else +#define MySysEnvirons SysEnvirons +#endif + +#define MINIMUM_HEAP_SIZE_MULTIPLE ((2*256)+128) +#define MAXIMUM_HEAP_SIZE_MULTIPLE (100*256) + +void (*exit_tcpip_function) (void); +#ifndef MACHO +extern void my_pointer_glue (void (*function) (void)); +#endif + +int execution_aborted; + +int main (void) +{ + Handle stack_handle,font_handle; +#ifdef WRITE_HEAP + Handle profile_handle; +#endif + long *stack_p; + + exit_tcpip_function=NULL; + execution_aborted=0; + +#ifdef WRITE_HEAP + profile_handle=GetResource ('PRFL',128); + if (profile_handle!=NULL && *profile_handle!=NULL) + min_write_heap_size=**(long**)profile_handle; +#endif + +#ifdef G_POWER + stack_handle=GetResource ('STHP',0); +#else + stack_handle=GetResource ('STCK',0); +#endif + stack_p=*(long**)stack_handle; + + stack_size=(stack_p[0]+3) & ~3; + heap_size=(stack_p[2]+7) & ~7; + flags=stack_p[3]; + +#ifdef SIMULATE + n_processors=stack_p[1]; + if (n_processors<1) + n_processors=1; + if (n_processors>1024) + n_processors=1024; +#else +# ifdef G_POWER + heap_size_multiple=stack_p[1]; + if (heap_size_multiple<MINIMUM_HEAP_SIZE_MULTIPLE) + heap_size_multiple=MINIMUM_HEAP_SIZE_MULTIPLE; + if (heap_size_multiple>MAXIMUM_HEAP_SIZE_MULTIPLE) + heap_size_multiple=MAXIMUM_HEAP_SIZE_MULTIPLE; + initial_heap_size=(stack_p[4]+7) & ~7; +# endif +#endif + +#ifndef MACOSX +# ifndef PARALLEL + SetApplLimit (GetApplLimit()-stack_size-1024); +# else + SetApplLimit (GetApplLimit()-heap_size-stack_size-1024); +# endif + if (MemError()!=0) + return 0; +#endif + +#ifdef PARALLEL + load_code_segments(); +#endif + + font_id=-1; + + font_handle=GetResource ('Font',128); + if (font_handle!=NULL){ + get_font_number ((char*)((*(short **)font_handle)+1)); + font_size=**(short**)font_handle; + } + + if (font_id==-1){ +#ifdef NEW_HEADERS + font_id=kFontIDMonaco; +#else + font_id=monaco; +#endif + font_size=9; + } + + if (!init_terminal()) + return 1; + +/* srand (TickCount()); */ + +#ifdef G_POWER + wait_next_event_available=1; +#else +# ifdef powerc + if (NGetTrapAddress (0xA860,ToolTrap)!=GetTrapAddress (0xA89F)) +# else + if (GetToolTrapAddress (0xA860)!=GetTrapAddress (0xA89F)) +# endif + wait_next_event_available=-1; + else + wait_next_event_available=0; +#endif + +#ifndef MACOSX + if (MySysEnvirons (1,&system_environment)==noErr){ +# ifndef G_POWER + switch (target_processor){ + case 2: + if (system_environment.processor==env68000 || + system_environment.processor==env68010 || + system_environment.hasFPU==0) + { + ew_print_string ("This program requires a MC68020 processor with MC68881 coprocessor or better\n"); + + wait_for_key_press(); + exit_terminal(); + return 0; + } + break; + case 1: + if (system_environment.processor==env68000 || + system_environment.processor==env68010) + { + ew_print_string ("This program requires a MC68020 processor or better\n"); + + wait_for_key_press(); + exit_terminal(); + return 0; + } + } +# endif + } +#endif + +#ifdef SIMULATE + processor_table_size=n_processors*64; + processor_table=(int) NewPtr (processor_table_size); + end_processor_table=processor_table+processor_table_size; +#endif + +#ifdef COMMUNICATION + if (init_communication()) +#endif + + abc_main(); + +#ifdef COMMUNICATION + exit_communication(); +#endif + + if (exit_tcpip_function!=NULL) +#ifdef MACHO + exit_tcpip_function(); +#else + my_pointer_glue (exit_tcpip_function); +#endif + + if (!(flags & 16) || (flags & 8) || execution_aborted!=0){ +#ifdef COMMUNICATION + if (my_processor_id==0) +#endif + wait_for_key_press(); + } + exit_terminal(); + +#ifdef G_POWER + first_function(); +#endif + + return 0; +} + +#ifdef TIME_PROFILE +void create_profile_file_name (unsigned char *profile_file_name) +{ + unsigned char *cur_ap_name,*end_profile_file_name; + int cur_ap_name_length,profile_file_name_length,n; + + cur_ap_name=(unsigned char *)LMGetCurApName(); + cur_ap_name_length=cur_ap_name[0]; + ++cur_ap_name; + + for (n=0; n<cur_ap_name_length; ++n) + profile_file_name[8+n]=cur_ap_name[n]; + + profile_file_name_length=cur_ap_name_length+13; + if (profile_file_name_length>31) + profile_file_name_length=31; + + *((unsigned int*)&profile_file_name[4])=profile_file_name_length; + + end_profile_file_name=&profile_file_name[8+profile_file_name_length]; + + end_profile_file_name[-13]=' '; + end_profile_file_name[-12]='T'; + end_profile_file_name[-11]='i'; + end_profile_file_name[-10]='m'; + end_profile_file_name[-9]='e'; + end_profile_file_name[-8]=' '; + end_profile_file_name[-7]='P'; + end_profile_file_name[-6]='r'; + end_profile_file_name[-5]='o'; + end_profile_file_name[-4]='f'; + end_profile_file_name[-3]='i'; + end_profile_file_name[-2]='l'; + end_profile_file_name[-1]='e'; +} +#endif + +#if defined(G_POWER) +static void my_user_item_proc (DialogPtr dialog_p,int the_item) +{ + short item_type; + Handle item_handle; + Rect item_rect; + PenState pen_state; + + GetDialogItem (dialog_p,the_item,&item_type,&item_handle,&item_rect); + + GetPenState (&pen_state); + PenNormal(); + PenSize (3,3); + InsetRect (&item_rect,-4,-4); + FrameRoundRect (&item_rect,16,16); + SetPenState (&pen_state); +} + +#if defined (MACOSX) && !defined (NEW_HEADERS) +extern UserItemUPP NewUserItemUPP (ProcPtr); +#endif + +#ifdef NEW_HEADERS +int +#else +UserItemUPP +#endif + myoutlinebuttonfunction (void) +{ +#ifdef MACOSX + return NewUserItemUPP (my_user_item_proc); +#else + return NewUserItemProc (my_user_item_proc); +#endif +} + +#ifndef NEW_HEADERS +QDGlobals *qdglobals (void) +{ + return &qd; +} +#endif + +#endif |