File: macnapp.h

package info (click to toggle)
mpack 1.6-8.1
  • links: PTS
  • area: main
  • in suites: stretch
  • size: 1,144 kB
  • ctags: 1,184
  • sloc: ansic: 8,785; sh: 330; makefile: 75; perl: 25
file content (631 lines) | stat: -rw-r--r-- 25,950 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
/* macnapp.h -- general mac application library header
 */
/* (C) Copyright 1995 by Carnegie Mellon University
 * All Rights Reserved.
 *
 * Permission to use, copy, modify, distribute, and sell this software
 * and its documentation for any purpose is hereby granted without
 * fee, provided that the above copyright notice appear in all copies
 * and that both that copyright notice and this permission notice
 * appear in supporting documentation, and that the name of Carnegie
 * Mellon University not be used in advertising or publicity
 * pertaining to distribution of the software without specific,
 * written prior permission.  Carnegie Mellon University makes no
 * representations about the suitability of this software for any
 * purpose.  It is provided "as is" without express or implied
 * warranty.
 *
 * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
 * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
 * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 * SOFTWARE.
 */
/* (C) Copyright 1990-1995 by Christopher J. Newman
 * All Rights Reserved.
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of Christopher J. Newman not be used in
 * advertising or publicity pertaining to distribution of the software without
 * specific, written prior permission.  Christopher J. Newman makes no
 * representations about the suitability of this software for any purpose.  It
 * is provided "as is" without express or implied warranty.
 *
 * CHRISTOPHER J. NEWMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
 * SHALL CHRISTOPHER J. NEWMAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
 * OF THIS SOFTWARE.
 *
 * Author:	Chris Newman
 * Message:	This is a nifty program.
 */

#ifdef THINK_C
#define QD(x)	(x)
#ifndef NULL
#define NULL	0
#endif
#else
#define QD(x)	(qd.x)
#include <MacTypes.h>
#include <Quickdraw.h>
#include <Events.h>
#include <Controls.h>
#include <Windows.h>
#include <MemoryMgr.h>
#include <Menus.h>
#include <OSUtils.h>
#include <TextEdit.h>
#include <Dialogs.h>
#endif

/* dual pascal/C strings
 */
typedef unsigned char PCstr;
#define C(str)	((char*)(str) + 1)
#define P(str)	((unsigned char*)(str))

/* various machine types.
 */
typedef unsigned short WORD;
typedef unsigned char BYTE;

/* useful macros:
 */
#define HIWORD(x)	( (WORD) ( (x) >> 16) )
#define LOWORD(x)	( (WORD) (x) )

/* most window/menu procedures return short integers (see defines below)
 */
typedef short (*na_menup)(struct na_win *, WORD, WORD);
typedef short (*na_mousep)(struct na_win *, Point, short, short);
typedef short (*na_ctrlp)(struct na_win *, Point, short, short, ControlHandle);
typedef short (*na_activep)(struct na_win *, Boolean);
typedef short (*na_closep)(struct na_win *);
typedef void (*na_afterp)(struct na_win *);
typedef short (*na_updatep)(struct na_win *, Boolean);
typedef short (*na_keyp)(struct na_win *, long, short);
typedef short (*na_cursorp)(struct na_win *, Point);
typedef short (*na_miscp)(struct na_win *, EventRecord *);
typedef short (*na_idlep)(struct na_win *);
typedef short (*na_taskp)(struct na_win *);
typedef short (*na_resizep)(struct na_win *, Point, Rect *);
typedef short (*na_openp)(short, FSSpec *, FInfo *);
typedef short (*na_initp)(struct na_win *, long *);
typedef struct na_win {
	long			flags;		/* flags indicating various window settings (see below) */
	short			delay;		/* delay between main loop cycles (in ticks) */
	short			mousepix;	/* number of pixels mouse can move until drag starts */
	short			minw, minh;	/* minimum width and height for the window */
	short			maxw, maxh;	/* maximum width and height for the window */
	short			type;		/* current window type (negatives reserved) */
	BYTE			locks;		/* locks on this window structure */
	short			priority;	/* priority if there is a taskp (-1 = everytime) */
	RgnHandle		cursorRgn;	/* cursor region */
	RgnHandle		uncrsrRgn;	/* region cursor isn't in */
	WindowPtr		pwin;		/* window pointer */
	struct na_win	**next;		/* handle to next window in linked list */
	struct na_win	**task;		/* handle to next task in a linked list of active tasks */
	struct na_win	**child;	/* handle to child window list (NULL = no child) */
	struct na_win	**parent;	/* handle to parent window (NULL = toplevel) */
	na_menup		menup;		/* menu proc */
	na_mousep		mousep;		/* mouse proc */
	na_ctrlp		ctrlp;		/* dialog item/control proc */
	na_activep		activep;	/* activate proc */
	na_closep		closep;		/* close proc */
	na_afterp		afterp;		/* after proc */
	na_updatep		updatep;	/* update proc */
	na_keyp			keyp;		/* key proc */
	na_cursorp		cursorp;	/* cursor setting proc */
	na_miscp		miscp;		/* miscellaneous event proc (disk/net/app/driver) */
	na_idlep		idlep;		/* idle proc */
	na_taskp		taskp;		/* task proc */
	na_resizep		resizep;	/* resize proc */
	long			resid;		/* storage for window resource id or user data. */
	char			*data;		/* data pointer for user */
} na_win;
typedef struct nate_win {
	na_win			winp;
	TEHandle		hTE;		/* textedit handle for auto-textedit routines */
	ControlHandle	hctrl;		/* horizontal scroll bar for textedit */
	ControlHandle	vctrl;		/* vertical scroll bar for textedit */
	long			docwidth;	/* width of the document */
	short			lheight;	/* line height of text */
	short			topoff;		/* offset from top of window to textedit area */
} nate_win;
/* procedures types:
 *
 * // called for menu events when window is frontmost
 * // supercedes global menu function unless NA_NOTPROCESSED is returned.
 * // if menuid is 0, the procedure should enable/disable menus appropriately
 * // if menuid is 1, the procedure should disable enabled menus appropriately
 * short menu(winp, menuid, itemno)
 *	WORD menuid;			// resource id of the menu
 *	WORD itemno;			// item number of the menu item
 *
 * // called for mouse down/up/move events in the window
 * short mouse(winp, p, type, mods)
 *	Point p;				// location of mouse action
 *	short type;				// type of mouse action (see below)
 *	short mods;				// modifier keys
 *
 * // called for dialog events in dialog windows
 * // control events in windows with controls
 * // In a dialog window with no key procedure, ESC, command-., return, enter are
 * // mapped to iCancel and iOk.
 * short control(winp, p, itemHit, mods, ctrlh)
 *	Point p;				// point in window local coords
 *	short itemHit;			// the item/part code clicked
 *	short mods;				// modifier keys
 *	ControlHandle ctrlh;	// handle to the control
 *
 * // called when window is activated or deactivated
 * // close return values may be ignored on a deactivate
 * short activate(winp, on)
 *	Boolean on;				// true = activate, false = deactivate
 *
 * // called when a window close request has been made (close box/close menu item)
 * // called when any window function returns NA_REQCLOSE or NA_REQCLOSEALL
 * // respond with either NA_CLOSED or NA_NOTPROCESSED
 * short close(winp)
 *
 * // called after window closed & removed from lists, but before window object freed
 * void afterp(winp)
 *
 * // called on update events
 * short update(winp, newsize)
 *	Boolean newsize;		// true if r is a new window size
 *
 * // called on key/autokey events (menu keys are parsed out first)
 * short key(winp, c, mods)
 *	long c;					// ASCII value of the key (unless NA_RAWKEY option set)
 *	short mods;				// modifier keys
 *
 * // called when cursor moves into or out of a window
 * // use winp->flags & NA_CURSORON
 * // close request return values are ignored.
 * // return NA_PROCESSED only when the cursorRgn is changed
 * short cursor(winp, p)
 *	Point p;				// point where the cursor is
 *
 * // This is called for miscellaneous events (disk/network/driver/app1-3)
 * short miscp(winp, pevent)
 *	EventRecord *pevent;	// the event
 *
 * // called every time through the event loop when window active
 * short idle(winp)
 *
 * // called cyclicly with other tasks with each pass through event loop
 * // only used when task is installed
 * // the task procedure can only close it's own window.
 * short task(winp)
 *
 * // function called to resize the window 
 * // (parameters similar to GrowWindow function)
 * short resize(winp, where, rct)
 *  Point where;
 *  Rect *rct;
 *
 * // function passed to NAinit:
 * // should return 0 if OK, and -1 to stop opening files
 * short open(message, afile, fspec)
 *	short message;			// either appOpen or appPrint (in SegLoad.h)
 *  FSSpec *fspec;			// file to open/print
 *  Finfo *finfo;			// finder info
 *
 * // function passed to NAwindow:
 * // returns standard window status
 * short init(winp, datap)
 *	na_win	*winp;			// pointer to new window structure
 *	long	*datap;			// pointer to data passed through NAwindow
 */

/* niftyapp globals */
extern na_win **NAhead;			/* handle to the head of the window tree */
extern na_win **NAtask;			/* handle to the head of the window task list */
extern na_win **NActask;		/* handle to the current task */
extern na_win *NAwin;			/* pointer to current window (NULL = no current window) */
extern na_menup NAmenup;		/* pointer to default menu procedure */
extern MenuHandle **NAmenus;	/* list of menu handles */
extern short NAnewitem;			/* item number of the new item on the file menu (0 = not avail) */
extern short NAcloseitem;		/* item number of the close item on the file menu (0 = not avail) */
extern short NAappleitems;		/* the number of (user) items at the top of the apple menu */
extern short NAhelpitems;		/* the number of (user) help items */
extern short NAhelpcount;   	/* the number of (system) items at the top of the help menu */
extern Boolean NAhasedit;		/* true if application has an edit menu */
extern long NAdelay;			/* the wait next event delay */
extern SysEnvRec NAsysenv;		/* mac system environment */
extern Boolean NAinBack;		/* true if application is backgrounded */
extern long NAmousetime;		/* time of last mouse up event */
extern short NAlastmouse;		/* kind of last mouse event */
extern Cursor NAibeam;			/* the ibeam cursor */
extern long NAgestaltBits;  	/* 0 = gestalt not on system */

/* globals for your convenience */
extern RgnHandle NAfullRgn, NAnullRgn;

/* niftyapp definitions */

/* default resource id for niftyapp windows */
#define NA_CLIPWINDOW	1000
#define NA_ABOUTDLOG  	1000
#define NA_PREFSDLOG  	1001
#define NA_HELPSTR		1000
/* default item numbers for OK & cancel */
#define iOk				1
#define iCancel			2
/* default ids for APPLE, FILE, EDIT, and HELP menus */
#define mApple			128
#define mFile			129
#define mEdit			130
#define mHelp			((WORD)-16490)
/* default item numbers for about & edit menu */
#define iAbout			1
#define iUndo			1
#define iCut			3
#define iCopy			4
#define iPaste			5
#define iClear			6
#define iSelAll			7
#define iClipboard		9
/* new window positions */
#define NA_HFULLSCN		0x0000
#define NA_HQUARTERSCN	0x0001
#define NA_HHALFSCN		0x0002
#define NA_H3QUARTERSCN	0x0003
#define NA_VFULLSCN		0x0000
#define NA_VQUARTERSCN	0x0004
#define NA_VHALFSCN		0x0008
#define NA_V3QUARTERSCN	0x000C
#define NA_CENTERSCN	0x0000
#define NA_TOPSCN		0x0010
#define NA_BOTTOMSCN	0x0020
#define NA_LEFTSCN		0x0040
#define NA_RIGHTSCN		0x0080
#define NA_TITLEOFFSET	0x0100
/* new window flags */
#define NA_PLAINWIN		0x00000000L	/* plain window -- no title, simple border */
#define NA_COLORWINDOW	0x00000001L	/* allow color in the window */
#define NA_DIALOGWINDOW	0x00000002L	/* open as a dialog */
#define NA_TITLEBAR		0x00000004L	/* have title bar */
#define NA_GROWBOX		0x00000008L	/* have a grow box (enables automatic drawing) */
#define NA_ZOOMBOX		0x00000010L	/* have a zoom box */
#define NA_CLOSEBOX		0x00000020L	/* have a close box (enables close menu item) */
#define NA_SHADOWBORDER	0x00000040L	/* have a shadow border (for dialogs) */
#define NA_DOUBLEBORDER	0x00000080L	/* have a double (dialog) border */
#define NA_ROUNDBORDER	0x000000c0L	/* have rounded corners and black title bar */
#define NA_CHILDWINDOW	0x00000100L	/* open as a child window of current window */
#define NA_NOTVISIBLE	0x00000200L	/* do not make window visible on open */
#define NA_BEHIND		0x00000400L	/* open window behind current window */
#define NA_HASCONTROLS	0x00000800L	/* process/draw/kill controls automatically */
#define NA_HASTASK		0x00001000L	/* install window in background task list */
#define NA_USERESOURCE	0x00002000L	/* use res parameter as WIND/DLOG/wctb/dctb resource */
#define NA_CURSORON		0x00004000L	/* true if application has set the cursor */
#define NA_MODAL		0x00008000L	/* set if window/dialog will be modal */
#define NA_DEFBUTTON	0x00010000L	/* show default button after init proc */
#define NA_COPYDATA		0x00020000L	/* data will by copied by NAwindow */
#define NA_SMARTSIZE	0x00040000L	/* window resizes & placements are saved in WIND res */
#define NA_FORCESIZE	0x00080000L	/* when a resource is used, re-size the window anyway */
#define NA_RAWKEY		0x00100000L	/* if set, key event fields aren't stripped */
#define NA_HILITECTRLS	0x00200000L	/* if set, hilite controls on activate/deactive */
#define NATE_FLAGS		0x0f000000L	/* flags reserved for NATE */
#define NA_USER_FLAG1	0x10000000L	/* flags reserved for users */
#define NA_USER_FLAG2	0x20000000L
#define NA_USER_FLAG3	0x40000000L
#define NA_USER_FLAG4	0x80000000L
/* niftyapp window/task types */
#define NA_CLIPTYPE		-1
#define NA_DEBUGTYPE	-2
#define NA_TCPTYPE		-3
#define NA_SMTPTYPE		-4
/* mouse click types */
#define NA_DOWN1		0
#define NA_UP1			1
#define NA_DOWN2		2
#define NA_UP2			3
#define NA_DOWNN		4
#define NA_UPN			5
#define NA_DRAG			6
#define NA_RELEASE		7
/* return values for window/menu procedures */
#define NA_ALLCLOSED	-4		/* all windows are to be destroyed & exit app immediately */
#define NA_REQCLOSEALL	-3		/* request to close all windows & exit app */
#define NA_CLOSED		-2		/* current window is ready to close (used by closep/taskp) */
#define NA_REQCLOSE		-1		/* request to close current window */
#define NA_NOTPROCESSED	0		/* use any default handler available */
#define NA_PROCESSED	1		/* do nothing more */
#define NA_USERINTERACT 2		/* user interaction pending -- don't do tasks */
/* Gestalt bits */
#define NA_HASAEVENTS	0x00000001L	/* Apple events supported */
#define NA_HASFSSPEC    0x00000002L /* FSSpec calls supported */
#define NA_HASSTDFILE   0x00000004L /* New standard file available */

/* niftyapp basic macros */

#define NAunlockWindow(winp)		{if (!--(winp)->locks) HUnlock((Handle) GetWRefCon((winp)->pwin));}
#define NAunlockWindowh(winh, winp)	{if (!--(winp)->locks) HUnlock((Handle) winh);}
#define NAisDAWindow(pWnd)			(( (WindowPeek) pWnd)->windowKind < 0)
#define NAmenuh(menu)				((*NAmenus)[(menu) - mApple])
#define NAenableMItem(menu, item)	EnableItem(NAmenuh(menu), item)
#define NAdisableMItem(menu, item)	DisableItem(NAmenuh(menu), item)
#define NAcheckItem(menu, item, c)	CheckItem(NAmenuh(menu), item, c)
#define NAgetDHandle(dlg, it, hn)	{short ty; Rect r; GetDItem(dlg, it, &ty, (Handle *) (hn), &r);}
#define NAgetDRect(dlg, it, rct)	{short ty; Handle hn; GetDItem(dlg, it, &ty, &hn, (rct));}
#define NAsetIval(dlg, it, val)		{short ty; Rect r; Handle hn; GetDItem(dlg, it, &ty, &hn, &r); SetCtlValue((ControlHandle)hn, (val));}
#define NAsetInum(dlg, it, val)		NAsetIText(dlg, it, longtoPCstr(val))
#define NAalert(resid)				Alert(resid, NAfilterProc)

/* niftyapp basic procedures */

/* initialize the Macintosh managers and niftyapp internal variables.
 * optionally set up a menu bar & menu procedure.
 * Returns 0 if OK, negative if an error occured, 1 if print files requested & app should quit
 * short minK;			// minimum K needed to execute
 * short masters;		// number of times to call MoreMasters()
 * na_proc *openp;		// open file procedure -- called for each application in the startup list
 * na_proc *menup;		// pointer to a menu procedure (NULL = no menu handling)
 * short nummenu;		// number of menus (starting at mApple == 128)
 * short numapple;		// number of apple menu items
 * short newitem;		// item number of new item (mFile)
 * short closeitem;		// item number of close item (mFile)
 */
short NAinit(short, short, na_openp, na_menup, short, short, short, short);

/* call the main loop procedure
 */
void NAmainloop(void);

/* create a rectangle based on the screen size
 *	short position;		// see above
 */
Rect *NAscreenrect(short);

/* create a new window structure
 * returns window status result, up to the caller to pass on NA_ALLCLOSED
 *	Rect *rpos;			// placement rectangle
 *	long flags;			// flags determining type of window
 *	char *title;		// window title (C string may not be NULL unless NA_USERESOURCE)
 *	short res;			// resource number of WIND/DLOG/wctb/dctb/DITL
 *	long *initdata;		// window data (may be NULL)
 *	long datasize;		// bytes of window data
 *	na_proc *initp;		// procedure to initialize the window functions, etc.
 */
short NAwindow(Rect *, long, char *, short, long *, long, na_initp);

/* create & add a new task to the task list, given pointer to task procedure,
 * and data size
 */
na_win **NAaddtask(na_taskp, long);

/* standard init procedure for an about box -- stops all background tasks, however */
short NAabout(na_win*, long*);

/* standard button flash procedure used by shell for keypresses */
void NAflashButton(DialogPtr, short);

/* draw the default button */
void NAdefaultButton(DialogPtr);

/* filter proc for modal dialogs which handles ESC and command-. */
pascal Boolean NAfilterProc(DialogPtr, EventRecord *, short *);

/* re-calculate cursor region information (after changing winp->cursorRgn) */
void NAcalcCursor(na_win*);

/* this saves a window's dimensions into a 'WIND' resource with appropriate resid */
void NAsaveWin(na_win*);

/* This is available to access window structures other than the current window
 * best for looking at parent window or child window(s).
 */
na_win *NAlockWindow(na_win**);

/* This is available, but the user should only call it is severe cases */
short NAcloseWindow(na_win*, short);

/* this is for closing all windows, the user should only call it from main
 * usually NAhead is the first parameter.
 */
short NAcloseWindows(na_win**, short);

/* this is for sending an event directly to the misc procedure of all windows.
 * usually NAhead is the first parameter.
 */
short NAallWindows(na_win**, EventRecord*);


/* niftyapp clipboard library:
 * NAclipboard: true = window on, false = window off, 'TEXT' or 'PICT'
 */
void NAclipboard(Boolean, ResType);


/* niftyapp debug library:
 */
void NAdebug(char *, ...);
#ifdef DEBUG
#define NADEBUG(x) NAdebug x
#else
#define NADEBUG(x)
#endif


/* niftyapp dialog library:
 */
/* select a radio button
 * returns number from 0 to firstitem - lastitem: the button that's been pressed
 *	DialogPtr dialog;	// the dialog window
 *	short firstitem;	// the itemno of first radio button
 *	short lastitem;		// the itemno of last radio button
 *	short setting;		// the radio button to set (itemno to lastitem)
 */
short NAradioSet(DialogPtr, short, short, short);

/* get the itemno of the active radio button
 *	DialogPtr dialog;	// the dialog window
 *	short firstitem;	// the itemno of first radio button
 *	short lastitem;		// the itemno of last radio button
 */
short NAradioGet(DialogPtr, short, short);

/* enable/disable,hilite,show/hide an item in a dialog window */
void NAenableDItem(DialogPtr, short, Boolean);
void NAhiliteDItem(DialogPtr, short, short);
void NAvisibleDItem(DialogPtr, short, Boolean);

/* set/get the item text in a dialog item */
void NAsetIText(DialogPtr, short, PCstr*);
void NAgetIText(DialogPtr, short, PCstr*);

/* enable/disable modal menus for a moveable modal dialog box (1 = go modal) */
void NAmodalMenus(int);

/* handle edit menu for dialogs */
short NAdialogMenu(na_win *, WORD, WORD);


/* NATE (NiftyApp TextEdit) libraries
 */
#define NATEflags (NA_TITLEBAR | NA_GROWBOX | NA_ZOOMBOX | NA_CLOSEBOX \
	| NA_HASCONTROLS | NA_HILITECTRLS)
#define NATE_DEFAULT	0x00000000L
#define NATE_READONLY	0x01000000L
#define NATE_NOMOUSE    0x02000000L
#define NATE_NOHSCROLL	0x04000000L
#define NATE_NOVSCROLL	0x08000000L
void NATEinit(na_win*, long, short, Ptr, long); /* winp, flags, horizwidth, data, len */
short NATEinitp(na_win*, long*);
short NATEmousep(na_win*, Point, short, short);
short NATEidlep(na_win*);
short NATEactivep(na_win*, Boolean);
short NATEkeyp(na_win*, long, short);
short NATEmenup(na_win*, WORD, WORD);
short NATEupdatep(na_win*, Boolean);
short NATEctrlp(na_win*, Point, short, short, ControlHandle);
short NATEclosep(na_win*);

void NATEsetscroll(na_win*, Boolean, Rect*, Rect*);
void NATEappend(na_win*, char*, long);


/* Niftyapp file library
 */
/* get a file to open -- similar to StandardGetFile, but works on older systems
 * extra fields in "StandardFileReply" are only valid if NA_HASSTDFILE is set in
 * NAgestaltBits
 */
void NAgetFile(FileFilterProcPtr, short, SFTypeList, StandardFileReply *);
/* put a file to open -- similar to StandardPutFile, but works on older systems
 * extra fields in "StandardFileReply" are only valid if NA_HASSTDFILE is set in
 * NAgestaltBits
 */
void NAputFile(Str255, Str255, StandardFileReply *);


/* Niftyapp TCP library
 */
/* tcp stream descriptor */
typedef int na_tcp;
/* tcp init function 
 *  passed NATCP_connect for success, NATCP_nodriver/NATCP_nomem for failure
 *  passed 1 to 100 for progress waiting for MacTCP to finish cleanly
 */
typedef void na_tcpinitp(short);
/* TCP read/status callback for connection, or TCP window
 * void *user;   Context generic pointer (passed to NATCPopen)
 * na_tcp s;     TCP stream id
 * short status; TCP status (see below)
 * long size;    size of buffer (or Macintosh error)
 * char *data;   data or NULL
 */
typedef void na_tcpreadp(void *, na_tcp, short, long, char *);
typedef void na_readp(na_win *, short, long, char *);
/* TCP window */
typedef struct natcp_win {
	na_win		winp;
	na_tcp		s;
	na_readp    *readp;
} natcp_win;
/* status values/bits */
#define NATCP_closing  0x08		/* other end of connection closed */
#define NATCP_urgent   0x04		/* in urgent mode */
#define NATCP_more     0x02		/* more data will follow immediately */
#define NATCP_data     0x01		/* data to read */
#define NATCP_connect  0x00		/* connection ready */
#define NATCP_noread   -1		/* non-fatal */
#define NATCP_nowrite  -2		/* fatal... */
#define NATCP_nodriver -3
#define NATCP_notcpbuf -4
#define NATCP_nomem    -5
#define NATCP_nohost   -6
#define NATCP_nocon    -7
#define NATCP_closed   -8		/* connection fully closed */
/* open flags */
#define NATCP_server	0x01	/* be a server */
/* functions */
void NATCPinit(na_tcpinitp *);
/* NATCPsettings: TCP buffer size, type of service, precedence, write buffer size */
void NATCPsettings(long, short, short, unsigned short);
short NATCPtask(na_win *);
/* NATCPopen: callback, context, host, port, flags */
na_tcp NATCPopen(na_tcpreadp *, void *, char *, long, short);
na_tcp NATCPwinopen(natcp_win *, char *, long, short); /* tcp window, host, port, flags */
short NATCPwrite(na_tcp, Ptr, long, short); /* tcp, buffer, length, dispose */
short NATCPputchar(na_tcp, char);
void NATCPclose(na_tcp);
void NATCPdone(long); /* number of 1/60 sec intervals to wait for MacTCP to finish cleanly */
/* returns passes NATCP_connect to readp on success with hostname as argument */
void NATCPgethost(na_tcpreadp *, void *);


/* niftyapp SMTP library
 */
/* status:
 * void *context;	user context
 * short code;		see below
 * short err;		SMTP error code or NATCP error code (NASMTP_tcpfail) or 0
 * long num;		macintosh TCP error code or address number or 0
 * char *errstr;	SMTP error string or NULL
 */
typedef void (*na_smtpstat)(void *, short, short, long, char *);
#define NASMTP_progress   2 /* progress: err = % done */
#define NASMTP_badaddr    1 /* address was not valid */
#define NASMTP_completed  0 /* success */
#define NASMTP_nomem     -1 /* not enough memory */
#define NASMTP_badargs   -2 /* input arguments invalid */
#define NASMTP_oserr     -3 /* OS failure (e.g. file error) */
#define NASMTP_tcpfail   -4 /* TCP connection to SMTP server failed */
#define NASMTP_conclosed -5 /* connection closed by other side before completion */
#define NASMTP_badprot   -6 /* other end sent unrecognizable protocol */
#define NASMTP_temperr   -7 /* SMTP persistant temporary failure */
#define NASMTP_permerr   -8 /* SMTP permanent failure */
/* Submit email: statf, server, fspec, headers, envelope, flags, context */
void NASMTPsubmit(na_smtpstat, char *, FSSpec *, Handle, Handle, short, void *);
#define NASMTP_crtrans	0x01 /* flag indicating translation of CR -> CRLF desired */

/* PC, C string libraries:
 */
#define SetClen(pcstr)	(*((pcstr) + *(pcstr) + 1) = '\0')
#define PCstrlen(pcstr)	(*(pcstr))
#define Pstrlen(pstr)	(* (unsigned char *) (pstr))

void PtoPCstrcpy(PCstr*, char*);
void CtoPCstrcpy(PCstr*, char*);
void PCtoPCstrcpy(PCstr*, PCstr*);
void PtoPCstrncpy(PCstr*, char*, short);
void CtoPCstrncpy(PCstr*, char*, short);
void PtoPCstrcat(PCstr*, char*);
void CtoPCstrcat(PCstr*, char*);
PCstr *PtoPCstr(char*);
PCstr *CtoPCstr(char*);
void SetPlen(PCstr*);
PCstr *longtoPCstr(long);