[net.sources.mac] new and better ascii source.

roland@ttds.UUCP (Roland Karlsson) (11/01/85)

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<B/Q
X
XType MENU
X  ,257(0)
X  Edit
X   (Undo/Z
X   (-
X    Cut/X
X    Copy/C
X    Paste/V
X    Clear
X
XType CODE
X  b.out,0
X
XType BNDL = HEXA
X  ,128(0)
X* AscI 0
X*   ICN#
X*     0 128
X*   FREF
X*     0 128
X41736349 00000001 49434e23 00000000 00804652 45460000 00000080 
X
XType FREF = HEXA
X  ,128(0)
X* APPL 0
X4150504c 000000ff 
X
XType ICN# = HEXA
X  ,128(0)
X00010000 00028000 00044000 00082000 00101000 00200800 00400400 00bdc200
X01252100 02252080 043dc040 08252020 10252010 2025c008 40003f04 80604082
X40908041 20813022 1081c814 088e7f8f 04923007 02610007 01008007 00806007
X00401fe7 0020021f 00100407 00080800 00041000 00022000 00014000 00008000
X*
X00010000 00038000 0007c000 000fe000 001ff000 003ff800 007ffc00 00fffe00
X01ffff00 03ffff80 07ffffc0 0fffffe0 1ffffff0 3ffffff8 7ffffffc fffffffe
X7fffffff 3ffffffe 1ffffffc 0fffffff 07ffffff 03ffffff 01ffffff 00ffffff
X007fffff 003ffe1f 001ffc07 000ff800 0007f000 0003e000 0001c000 00008000
X
X
+ END-OF-FILE ascii.rc
chmod 'u=r,g=r,o=r' 'ascii.rc'
echo '	-r--r--r--  1 roland       1692 Oct 30 10:15 ascii.rc        (as sent)'
echo -n '	'
/bin/ls -l ascii.rc
echo 'Extracting ascii.h'
sed 's/^X//' > 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 <mac/quickdraw.h>
X#include <mac/toolintf.h>
X#include <mac/osintf.h>
X#include <mac/packintf.h>
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 ("<O", name);
X	    AppendMenu (my_menus[4], name);
X	    font_sizes[++num_of_sizes] = i;
X	}
X	else
X	    if (i == 9 || i == 10 || i == 12 || i == 14 || i == 18){
X		NumToString (i, name);
X		AppendMenu (my_menus[4], name);
X		font_sizes[++num_of_sizes] = i;
X	    }
X    InsertMenu (my_menus[4], 0);
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
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