Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Posting-Version: version B 2.10.1 6/24/83 (MC840302); site ttds.UUCP
Path: utzoo!linus!philabs!cmcl2!seismo!mcvax!enea!ttds!roland
From: roland@ttds.UUCP (Roland Karlsson)
Newsgroups: net.sources.mac
Subject: new and better ascii source.
Message-ID: <1041@ttds.UUCP>
Date: Thu, 31-Oct-85 17:35:57 EST
Article-I.D.: ttds.1041
Posted: Thu Oct 31 17:35:57 1985
Date-Received: Sun, 3-Nov-85 14:38:53 EST
Reply-To: roland@ttds.UUCP (Roland Karlsson)
Organization: The Royal Inst. of Techn., Stockholm
Lines: 779
This is a new version of the Ascii program for displaying fonts. I am very
greatfull for the help i got from poeple on the net. Most of all for the
help i got from Guido van Rossum (guido@mcvax). Copying from and pasting
to the desc scrap is now possible. Scaling of font and the file filter
that chose which files to show with SFGetFile works. I have implemented
command key equivalents for menu items.
This is: SUMacC Source code.
This is not: .hqx code (but i post it at the same time)
==============================================================================
Have a nice day wishes:
Roland Karlsson (roland@ttds)
Dpt. of Telecomm. & Computer Systems
Royal Institute of Technology
S-100 44 Stockholm
SWEDEN
==============================================================================
------ Cut here ------------------------------ and here ---------------------
: This is a shar archive. Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
echo 'Extracting ascii.rc'
sed 's/^X//' > ascii.rc << '+ END-OF-FILE ascii.rc'
Xascii.rsrc
X*
XType AscI = STR
X ,0(0)
Xascii is a font displaying program by Roland Karlsson made 1985.
X
X* pointing index finger
XType CURS = HEXA
X ,256(0)
X00002000 51402aa0 15500a88 1d041602 08010400 03e00010 00080004 00000000
X00002000 71403be0 1ff00ff8 1ffc1ffe 0fff07fe 03fe001c 000c0004 00000000
X00010001
X
XType STR
X ,1(0)
XThis is a sample text.
X
XType STR
X ,2(0)
XRoland Karlsson, Dpt. of Telecomm. & Computer Systems, Royal Institute of Technology, S-100 44 Stockholm, SWEDEN
X
XType WIND
X ,128(0)
X Cursed
X 20 0 342 512
X Visible noGoAway
X 2
X 0
X
XType MENU
X ,1(0)
X* @ is a dummy for the apple mark (Silly thing this !! ).
X @
X About ascii
X (-
X
XType MENU
X ,256(0)
X File
X Open
X Open FONT file
X Open file with FONT resource This is slow
X (-
X Quit ascii.h << '+ END-OF-FILE ascii.h'
X/* This is because of bug in compiler */
X#ifdef lint
X# define VOID (void)
X#else
X# define VOID
X#endif
X
X/* This is for compatibility with other C compilers */
X#define long int
X
X#define WINDOW 128
X
X#define SAMPLESTR 1
X#define AUTHORSTR 2
X
X#define MENUS 5
X#define APPLE 1
X#define ABOUT 1
X#define FILE 256
X#define OPEN1 1
X#define OPEN2 2
X#define OPEN3 3
X#define QUIT 5
X#define EDIT 257
X#define TEUNDO 1
X#define TECUT 3
X#define TECOPY 4
X#define TEPASTE 5
X#define TECLEAR 6
X#define FONTS 258
X#define FONTSIZE 259
X
X#define BAR 1
X#define WATCH 4
X#define FINGER 256
X
X#define NONE -1
XMenuHandle my_menus[MENUS];
Xlong the_menu, the_item;
XEventRecord my_event;
XCursHandle finger_c, watch_c, bar_c;
XWindowPtr which_w, the_w;
XWindowRecord w_record;
XRect ascii_r, text_r, view_r, char_r[16][16];
XPoint mouse_p;
XHandle sample_str, author_str;
XTEHandle h_text, h_authortext;
Xint which_font;
Xchar font_name[64];
Xint font_sizes[64];
Xint num_of_sizes = 0;
Xshort scrap_count;
Xint file_num, volume_num;
XSFReply file_record;
+ END-OF-FILE ascii.h
chmod 'u=r,g=r,o=r' 'ascii.h'
echo ' -r--r--r-- 1 roland 1013 Oct 30 08:36 ascii.h (as sent)'
echo -n ' '
/bin/ls -l ascii.h
echo 'Extracting ascii.c'
sed 's/^X//' > ascii.c << '+ END-OF-FILE ascii.c'
X#include
X#include
X#include
X#include
X#include "ascii.h"
X
Xmain () {
X /* Standard initialisation */
X struct QDVar QDVar;
X
X QD = &QDVar;
X InitGraf (&thePort);
X InitFonts ();
X FlushEvents (everyEvent, 0);
X InitWindows ();
X InitMenus ();
X TEInit ();
X InitDialogs ( (ProcPtr) 0);
X/* InitCursor (); Done in the LOOP */
X
X /* Application dependent initialisation */
X init_the_w ();
X init_the_text ();
X init_the_menu ();
X init_the_scrap ();
X init_the_cursor ();
X file_num = NONE;
X
X/* The Main Event LOOP */
X while (1){
X TEIdle (h_text);
X SystemTask ();
X
X VOID GetNextEvent (everyEvent, &my_event);
X
X if (the_w == FrontWindow ()){
X adjust_cursor ();
X mouse_p.h = my_event.where.h;
X mouse_p.v = my_event.where.v;
X GlobalToLocal (&mouse_p);
X }
X
X switch (my_event.what){
X case mouseDown:
X switch (FindWindow (&my_event.where, &which_w)){
X case inMenuBar:
X do_command (MenuSelect (&my_event.where));
X break;
X case inContent:
X if (the_w == FrontWindow ())
X the_w_click ();
X else
X SelectWindow (which_w);
X break;
X case inDrag:
X break; /* No drag done */
X case inGoAway:
X break; /* Ne exit availible */
X case inSysWindow:
X SystemClick (&my_event, which_w);
X break;
X }
X break;
X case autoKey:
X case keyDown:
X if (the_w == FrontWindow ())
X do_key ();
X break;
X case activateEvt:
X if (the_w == (WindowPtr) my_event.message){
X TEActivate (h_text);
X DisableItem (my_menus[2], TEUNDO);
X EnableItem (my_menus[3], 0);
X EnableItem (my_menus[4], 0);
X }
X else{
X TEDeactivate (h_text);
X EnableItem (my_menus[2], TEUNDO);
X DisableItem (my_menus[3], 0);
X DisableItem (my_menus[4], 0);
X }
X DrawMenuBar ();
X break;
X case updateEvt:
X if (the_w == (WindowPtr) my_event.message){
X BeginUpdate (the_w);
X SetCursor (*watch_c);
X draw_the_w ();
X TEUpdate (&text_r, h_text);
X ShowCursor ();
X EndUpdate (the_w);
X }
X break;
X }
X }
X}
X
Xinit_the_w (){
X int x, y;
X
X the_w = GetNewWindow (WINDOW, &w_record, (WindowPtr) - 1);
X SetRect (&ascii_r, 18, 18, 418, 320);
X SetRect (&text_r, 425, 18, 500, 317);
X SetRect (&view_r, 420, 0, 512, 322);
X for (x = 0; x < 16; x++)
X for (y = 0; y < 16; y++)
X SetRect (&char_r[x][y], 18+25*x, 18+19*y, 43+25*x, 37+19*y);
X SetPort (the_w);
X}
X
Xinit_the_text (){
X char temp_str[256];
X
X h_text = TENew (&text_r, &view_r); /* view_r > text_r */
X h_authortext = TENew (&text_r, &view_r);
X sample_str = GetString(SAMPLESTR);
X author_str = GetString(AUTHORSTR);
X p2c_string(*sample_str, temp_str);
X TESetText (temp_str, (int) (*sample_str)[0], h_text);
X p2c_string(*author_str, temp_str);
X TESetText (temp_str, (int) (*author_str)[0], h_authortext);
X}
X
Xchange_font (size) int size;{ /* 0 means new font => chose smallest */
X int font, i;
X TEHandle TEnew_h;
X Handle save_h;
X short int save_length,save_start, save_end;
X
X for (i = 1; i <= num_of_sizes; i++)
X CheckItem (my_menus[4], i, 0);
X GetItem (my_menus[3], which_font, font_name);
X GetFNum (font_name, &font);
X if (! size){
X for (i = 1; i <= num_of_sizes; i++)
X if (RealFont (font, font_sizes[i])){
X size = font_sizes[i];
X break;
X }
X if (size > 18)
X size = 12;
X }
X if (! size)
X size = 12;
X
X TextFont(font);
X TextSize(size);
X
X save_h = (*h_text)->hText; /* Save handle to text */
X save_length = (*h_text)->teLength;
X save_start = (*h_text)->selStart;
X save_end = (*h_text)->selEnd;
X
X TEnew_h = TENew(&text_r, &view_r); /* Create new record */
X
X (*h_text)->hText = (*TEnew_h)->hText; /* Change handle in old record */
X TEDispose(h_text); /* Dispose of old record */
X
X h_text = TEnew_h; /* Rename new record */
X
X (*h_text)->hText = save_h; /* Restore handle to text */
X (*h_text)->teLength = save_length;
X (*h_text)->selStart = save_start;
X (*h_text)->selEnd = save_end;
X
X TEActivate(h_text);
X TECalText (h_text);
X
X for (i = 1; i <= num_of_sizes; i++)
X if (the_w->txSize == font_sizes[i])
X CheckItem (my_menus[4], i, 1);
X}
X
Xinit_the_menu (){
X my_menus[0] = GetMenu(APPLE);
X (**my_menus[0]).menuData.s[1] = '\024'; /* Silly thing this !! */
X AddResMenu (my_menus[0], "DRVR");
X InsertMenu (my_menus[0], 0);
X
X my_menus[1] = GetMenu (FILE);
X InsertMenu (my_menus[1], 0);
X
X my_menus[2] = GetMenu (EDIT);
X InsertMenu (my_menus[2], 0);
X
X add_font_menu ();
X
X DrawMenuBar ();
X}
X
Xadd_font_menu (){
X my_menus[3] = NewMenu (FONTS, "Font");
X AddResMenu (my_menus[3], "FONT");
X InsertMenu (my_menus[3], 0);
X which_font = 1;
X CheckItem (my_menus[3], which_font, 1);
X change_font (12);
X add_size_menu ();
X change_font (0);
X}
X
Xadd_size_menu (){
X char name[64];
X int i;
X
X my_menus[4] = NewMenu (FONTSIZE, font_name);
X
X num_of_sizes = 0;
X for (i = 1; i < 128; i++)
X if (RealFont (the_w->txFont, i)){
X NumToString (i, name);
X append_string ("txSize == font_sizes[i])
X CheckItem (my_menus[4], i, 1);
X}
X
Xappend_string (app, str) char *app, *str;{
X int i, j;
X
X i = 0;
X while (str[i++] != 0 && i < 60);
X i--;
X
X j = 0;
X while (app[j] != 0 && i + j < 60)
X str[i++] = app[j++];
X str[i] = 0;
X}
X
Xinit_the_cursor (){
X finger_c = GetCursor (FINGER); HNoPurge ((Handle) finger_c);
X watch_c = GetCursor (WATCH); HNoPurge ((Handle) watch_c);
X bar_c = GetCursor (BAR); HNoPurge ((Handle) bar_c);
X}
X
Xinit_the_scrap (){
X ScrapStuff *scrap_stuff;
X
X scrap_stuff = InfoScrap ();
X scrap_count = ! ( scrap_stuff->scrapCount );
X/* get_scrap (); Dosn't work yet */
X}
X
Xdo_key (){
X char the_char;
X
X the_char = my_event.message & 0xff;
X if(my_event.modifiers & cmdKey)
X do_command(MenuKey(the_char));
X else{
X InvertRect (&char_r[(the_char>>4) & 0xf][the_char & 0xf]);
X TEKey (the_char, h_text);
X InvertRect (&char_r[(the_char>>4) & 0xf][the_char & 0xf]);
X }
X}
X
Xdraw_the_w (){
X int x, y, save_font, save_size;
X
X EraseRect (&the_w->portRect);
X FrameRect (&ascii_r);
X
X for (x = 0; x < 16; x++){
X save_font = the_w->txFont;
X save_size = the_w->txSize;
X the_w->txFont = systemFont;
X the_w->txSize = 12;
X MoveTo (5, char_r[0][x].top + 14);
X if (x < 10)
X DrawChar ( (char) ( x + '0') );
X else
X DrawChar ( (char) ( x + 'a' - 10) );
X MoveTo (char_r[x][0].topLeft.h + 5, 10);
X if (x < 10)
X DrawChar ( (char) ( x + '0') );
X else
X DrawChar ( (char) ( x + 'a' - 10) );
X the_w->txFont = save_font;
X the_w->txSize = save_size;
X for (y = 0; y < 16; y++){
X MoveTo (char_r[x][y].topLeft.h + 5, char_r[x][y].top + 14);
X DrawChar ( (char) ( x*16 + y ) );
X }
X }
X}
X
Xdo_command (help) long help;{
X char name[64];
X
X the_menu = HiWord (help);
X the_item = LoWord (help);
X switch (the_menu){
X case APPLE:
X if(the_item == ABOUT){
X about();
X break;
X }
X if(the_item == ABOUT + 1)
X break;
X GetItem (my_menus[0], the_item, name);
X {
X GrafPtr save_port;
X char *da_name ();
X
X GetPort (&save_port);
X if (GetNamedResource ("DRVR", name))/* Without leading zero */
X VOID OpenDeskAcc (name);
X else /* With leading zero */
X VOID OpenDeskAcc (da_name (name));
X SetPort (save_port);
X }
X break;
X case FILE:
X switch (the_item){
X case OPEN1:
X case OPEN2:
X case OPEN3:
X open_file (the_item);
X break;
X case QUIT:
X VOID LoadScrap ();
X ExitToShell ();
X break;
X }
X break;
X case EDIT:
X if (SystemEdit (the_item - 1))
X break;
X switch (the_item){
X case TECUT:
X TECut (h_text);
X put_scrap ();
X break;
X case TECOPY:
X TECopy (h_text);
X put_scrap ();
X break;
X case TEPASTE:
X get_scrap ();
X TEPaste (h_text);
X break;
X case TECLEAR:
X TEDelete (h_text);
X break;
X }
X break;
X case FONTS:
X CheckItem (my_menus[3], which_font, 0);
X which_font = the_item;
X change_font (0);
X CheckItem (my_menus[3], which_font, 1);
X
X num_of_sizes = 0;
X DeleteMenu (FONTSIZE);
X add_size_menu ();
X DrawMenuBar ();
X
X InvalRect (&the_w->portRect);
X break;
X case FONTSIZE:
X change_font (font_sizes[the_item]);
X InvalRect (&the_w->portRect);
X break;
X }
X HiliteMenu (0);
X}
X
Xadjust_cursor (){
X if (PtInRect (&mouse_p, &ascii_r)){
X SetCursor (*finger_c);
X return;
X }
X if (PtInRect (&mouse_p, &text_r)){
X SetCursor (*bar_c);
X return;
X }
X InitCursor ();
X}
X
Xabout(){
X EraseRect (&text_r);
X TEUpdate (&text_r, h_authortext);
X while (! Button ());
X while (Button ());
X EraseRect (&text_r);
X TEUpdate (&text_r, h_text);
X FlushEvents (everyEvent, 0);
X}
X
Xthe_w_click (){
X int x, y;
X
X if (PtInRect (&mouse_p, &ascii_r)){
X x = (mouse_p.h - 18) / 25;
X y = (mouse_p.v - 18) / 19;
X InvertRect (&char_r[x][y]);
X TEKey ( (char) ( x*16 + y ) , h_text);
X InvertRect (&char_r[x][y]);
X }
X if (PtInRect (&mouse_p, &text_r))
X if(my_event.modifiers & shiftKey)
X TEClick (&mouse_p, 1, h_text);
X else
X TEClick (&mouse_p, 0, h_text);
X}
X
Xput_scrap (){
X ScrapStuff *scrap_stuff;
X
X VOID ZeroScrap ();
X HLock (TEScrapHandle);
X VOID PutScrap (GetHandleSize (TEScrapHandle), "TEXT", *TEScrapHandle);
X HUnlock (TEScrapHandle);
X scrap_stuff = InfoScrap ();
X scrap_count = scrap_stuff->scrapCount;
X}
X
Xget_scrap (){
X int off, len;
X ScrapStuff *scrap_stuff;
X
X scrap_stuff = InfoScrap ();
X if (scrap_count == scrap_stuff->scrapCount)
X return;
X scrap_count = scrap_stuff->scrapCount;
X len = GetScrap (TEScrapHandle, "TEXT", &off);
X if (len >= 0)
X TEScrapLen = len;
X /* Else, it was probably a PICT or other type of scrap;
X in this case TEScrapHandle's contents has not been touched. */
X}
X
Xopen_file (item) int item;{
X Point top_left;
X int file_filter1(), file_filter2();
X OsType file_type;
X
X SetPt (&top_left, 50, 50);
X switch(item){
X case OPEN1:
X SFGetFile (&top_left, "", file_filter1, -1,
X (char *) 0, (ProcPtr) 0, &file_record);
X break;
X case OPEN2:
X file_type.s[0] = 'F';
X file_type.s[1] = 'F';
X file_type.s[2] = 'I';
X file_type.s[3] = 'L';
X SFGetFile (&top_left, "", file_filter1, 1,
X (char *) &file_type, (ProcPtr) 0, &file_record);
X break;
X case OPEN3:
X SFGetFile (&top_left, "", file_filter2, -1,
X (char *) 0, (ProcPtr) 0, &file_record);
X break;
X }
X if (file_record.good){
X if (file_num != NONE){
X VOID SetVol ((char *) 0, volume_num);
X CloseResFile (file_num);
X }
X volume_num = file_record.vRefNum;
X VOID SetVol ((char *) 0, volume_num);
X p2cstr ((char *) file_record.fName);
X file_num = OpenResFile (file_record.fName);
X DeleteMenu (FONTS);
X DeleteMenu (FONTSIZE);
X add_font_menu ();
X DrawMenuBar ();
X InvalRect (&the_w->portRect);
X }
X}
X
X/* This filter dosn't open System file, Ascii Application file and
X files without resource fork. */
X
X
Xfile_filter1() {
X struct pargs {
X FileParam *paramBlock;
X } pargs;
X char *retval= (char *) getpargs(&pargs, sizeof pargs);
X if (pargs.paramBlock->ioFlRLgLen == 0)
X *retval= 1; /* TRUE => skip this file */
X else{
X char fdType[5], fdCreator[5];
X
X Os2c_string(pargs.paramBlock->ioFlFndrInfo.fdType, fdType);
X Os2c_string(pargs.paramBlock->ioFlFndrInfo.fdCreator, fdCreator);
X if(EqualString("ZSYS", fdType, 0, 0) &&
X EqualString("MACS", fdCreator, 0, 0) ||
X EqualString("APPL", fdType, 0, 0) &&
X EqualString("AscI", fdCreator, 0, 0))
X *retval= 1; /* TRUE => skip this file */
X else
X *retval= 0; /* FALSE => show this file*/
X }
X}
X
X/* This filter dosn't open System file, Ascii Application file,
X files without resource fork and files whithout FONT resource. */
X
X
Xfile_filter2() {
X struct pargs {
X FileParam *paramBlock;
X } pargs;
X char *retval= (char *) getpargs(&pargs, sizeof pargs);
X if (pargs.paramBlock->ioFlRLgLen == 0)
X *retval= 1; /* TRUE => skip this file */
X else{
X char fdType[5], fdCreator[5];
X
X Os2c_string(pargs.paramBlock->ioFlFndrInfo.fdType, fdType);
X Os2c_string(pargs.paramBlock->ioFlFndrInfo.fdCreator, fdCreator);
X if(EqualString("ZSYS", fdType, 0, 0) &&
X EqualString("MACS", fdCreator, 0, 0) ||
X EqualString("APPL", fdType, 0, 0) &&
X EqualString("AscI", fdCreator, 0, 0))
X *retval= 1; /* TRUE => skip this file */
X else{
X int num_resources, f_num;
X char f_name[256];
X
X VOID SetVol ((char *) 0, pargs.paramBlock->ioVRefNum);
X num_resources = CountResources("FONT");
X p2c_string((char *) pargs.paramBlock->ioNamePtr, f_name);
X f_num = OpenResFile (f_name);
X if(CountResources("FONT") > num_resources)
X *retval= 0; /* FALSE => show this file*/
X else
X *retval= 1; /* TRUE => skip this file */
X CloseResFile(f_num);
X }
X }
X}
X
X/*
X * Some desk accessories have weird names that begin with a leading zero.
X * Since this fools the automatic C/Pascal string conversion stuff, we
X * have this little gem; given a C string, it returns a Pascal string
X * with leading zero.
X */
Xchar *da_name (s) char *s; {
X static char ps[32];
X int i = 1;
X register char *cp,*dp;
X
X cp = s;
X dp = &ps[2];
X while ((*dp++ = *cp++))
X i++;
X ps[0] = i;
X return (isapstr (ps));
X}
X
X/*
X * Copy a Pascal string into a buffer, converting it into a C string.
X */
Xp2c_string(pSource, cDestination)
Xchar *cDestination;
Xchar *pSource;
X{
X int i;
X
X for (i = 0; i < pSource[0]; ++i)
X cDestination[i] = pSource[i + 1];
X cDestination[i] = '\0';
X}
X
X/*
X * Copy a OsType string into a buffer, converting it into a C string.
X */
XOs2c_string(OsSource, cDestination)
Xchar *cDestination;
XOsType OsSource;
X{
X int i;
X
X for (i = 0; i < 4; ++i)
X cDestination[i] = OsSource.s[i];
X cDestination[4] = '\0';
X}
+ END-OF-FILE ascii.c
chmod 'u=r,g=r,o=r' 'ascii.c'
echo ' -r--r--r-- 1 roland 14358 Oct 30 11:03 ascii.c (as sent)'
echo -n ' '
/bin/ls -l ascii.c
exit 0