TweetFollow Us on Twitter

McFace
Volume Number:3
Issue Number:7
Column Tag:Fortran's World

McFace Fixes MS Fortran

By Chuck Bouldin, Gaithersburg, MD

Fortran Toolbox Access with McFace

Most programmers who use Fortran on the Macintosh do so because:(1) they already know Fortran, (2) they have a lot of existing code that they want to run on the Mac, or (3) they want to add Macintosh features to existing programs. So far, the articles on MacFortran have dealt mainly with adding toolbox and Mac-specific features to Fortran programs. From earlier articles, it is clear that adding Mac-style features to existing Fortran code is not easy to do. In this article I discuss the use of McFace, a large, high level, “glue” subroutine that greatly simplifies adding Mac features to Fortran programs.

McFace is particularly useful for porting existing Fortran applications, adding to the existing code the Mac “look and feel”. Apple is now pushing “desktop engineering” and 68020 upgrades are becoming commonplace, so it is important to find an easy means to port the large body of existing Fortran engineering and scientific code, while adding the user interface features required in a good Macintosh application.

McFace is a single, large (134K, whew!) subroutine that allows easy access to much of the Mac toolbox. The user interface is reduced to a single subroutine call with arguments that are used to pick out the various functions supplied by McFace. By making very small additions to existing Fortran source, it is easy to add support for the standard Apple, File and Edit menus, text editing of input and output streams, desk accessory support, and a graphics window. Graphics can be written to the screen and saved as Bitmaps or quickdraw pictures, allowing automatic handling of update events in the graphics window. With slightly more effort, existing Fortran can have dialogue boxes, alerts, and custom menus added. Conversion of existing programs to the event orientation of the Mac world is simplified. McFace also takes care of a lot of memory management automatically.

McFace is an external subroutine that, when called, is automatically linked in by Fortran’s runtime linking system. Thus, McFace need not be explicitly linked to a Fortran program that is under development, but can be “hard” linked after the final compilation. The use of runtime linking allows multiple applications to share one copy of McFace. McFace also has the Fortran Toolbx subroutine linked to it and contains resources. Because of this, the McFace subroutine must reside in the System folder of an HFS system.

In order to show how McFace works, it is best to do an example. Starting with the generic Fortran code for the famous Sieve of Eratosthenes benchmark, we will convert it to a Mac interface using McFace. This is done in two stages in order to show the hierarchy of McFace additions that can be made to generic Fortran code. Unfortunately, even if you have Fortran, you aren’t going to be able to run any of this code unless you also get McFace. Therefore, I intend to show the listings in order to illustrate how simple the code is in structure, while still letting you have a Mac interface on your Fortran programs. The three versions of the Sieve presented here are all functionally the same; they differ only in the user interface. To illustrate how the user interface changes as McFace additions are made, I have included copies of the output screens for each version of the program.

How it Works

Before diving in an a specific example, it is worthwhile to say a few general things about how McFace works. The main feature that makes the concept of McFace possible is the ability of Fortran to do input and output to “internal” files. That is, reads and writes can take place from a variable rather than from an i/o channel such as unit 5. McFace is able to intercept Fortran i/o by reassigning i/o to a specified internal file, in this case a character variable called MAC. McFace then acts as an intermediary that sits between the generic Fortran code and the new user interface possibilities of the Macintosh. McFace also adds a Common block to your applications so that communication between McFace and your code can be maintained through a few variables in Common.

A generic call to McFace has the form: Call McFace( 11 integer arguments). The first argument controls whether any character I/O is done, and, if so, to what window. The contents of the character variable “MAC” are used to shuttle character information between your Fortran code and McFace. The next 10 arguments are organized into 5 pairs. Each pair of numbers selects one of McFace’s high-level functions, or macros, for execution. This structure can be terse and a little cryptic, but it lets you pack a lot of power into a single call to McFace.

For example, the McFace call:

Call McFace(0, 4, 2, 3, 2, 2, -6, 0, 0, 0, 0)

will (1) Specify no I/O because of the initial 0, (2) the 4,2 specifies bringing a text edit window to the front, (3) the 3,2 moves the text insertion bar to the end of the text in the window, (4) finally the 2,-6 causes a return to the user’s code without updating the contents of MAC. The trailing zeroes are present since McFace can have up to 5 macro calls at one time. McFace must be called, like all Fortran subroutines, with a fixed number of arguments, so the last 2 unused macro slots must be zero-filled.

Without repeating the McFace documentation this gives some of the flavor of how McFace is used. The calls to McFace look more obscure than they really are, since about 6-8 different combinations of macros suffice to start out converting generic Fortan to a Mac interface.

Converting the Sieve

Listing 1 shows the “generic” Sieve of Eratosthenes, as supplied with the compiler by Absoft. Running this program brings up the “glass teletype” window that is defined by the Fortran runtime library. The user interface is nonexistent; what the user sees is unchanged from that of a conventional computer. The totally un-Mac-like output is shown in Screen 1.

Listing 2 shows the same code with the modifications needed to attach McFace to the existing code. The modifications are minimal: (1) There is some initialization code (2) I/O is trapped and routed through McFace by using a Fortran “internal file”, as described above. Characters are written to variable MAC rather than to an assigned I/O channel. Support for the standard Apple, File and Edit menus is automatically handled by McFace. The part of the code that is used to add McFace is in boldface, while the old “generic” Sieve code is in plain text. Screen 2 shows the user interface presented by the code of listing 2. For a very small amount of work, the user has essentially the full Mac interface! Much larger Fortan code can be adapted along the general lines shown here. The only disadvantage to this approach, as can be seen from the listing, is that McFace related code gets sprinkled throughout the old ANSI Fortran code.

Listing 3 shows a more complete adaptation of the Sieve for use with McFace. Here, McFace calls are not distributed throughout the existing Fortran code. Instead, the Sieve program has been converted to a subroutine that does no I/O. Communication with the main routine (a McFace shell) is done by passing an argument. This is a clean general solution to porting existing Fortran code to the Mac. The routines that do the real work are kept to simple ANSI Fortran, while McFace serves as the interface between the Fortran code and the Macintosh environment. Again, McFace related code is in boldface. Screen 3 shows the output of this code, which is almost identical to that of listing 2, except for the addition of an “About Sieve” alert. The advantage of using a McFace shell with standard Fortran subroutines for each menu entry is that every application has essentially the same structure, except for the application specific menu entries and resources. Writing new applications becomes quite trivial, since the standard shell is providing all the Mac-specific support features.

Notice that the use of a McFace shell allows the Sieve to be converted to a Menu driven system which incorporates the event orientation that all Mac programs should have. Events are actually trapped by McFace, which in turn reports Menu events back to the Fortran program so that the appropriate part of the user’s code is run. McFace takes care of handling Activate, Update, Scrolling, Auto-scrolling, Text Edit and SystemClick events, so that the work that is done by the application Fortran code is greatly reduced.

The menus, windows and alerts in McFace are all resources. Therefore, further customization of the McFace environment can be achieved by using ResEdit on McFace’s resources. This is nice for adjusting size, position and title of the McFace windows. One can also include new resources to be used for your own alerts, as shown in Listing 3 and Screen 3.

Critique

Like any other programming tool, McFace has both strengths and weaknesses. Here are some of each:

The ease of use of McFace is easily its biggest strength. To make the minimal modifications to the Sieve, which was the first thing I did with McFace, took about 20 minutes from the time that I first opened the documentation.

McFace provides enough built in functionality that writing new applications with McFace really takes less work than using the glass teletype environment supplied with Fortran. Once one application has been written with McFace, the subsequent ones are very easy.

At 134K, McFace is not small. McFace provides a tremendous gain in functionality over plain MacFortran, but it costs a lot of memory. This is a trade-off that was made deliberately, since the use of a single subroutine is what makes using McFace so simple. Under switcher or with a ram cache or ram disc you need to leave at least 256K of memory for any application that uses McFace. Big programs will require more. The space that McFace takes up on disc can be reduced by allowing more than one program to use McFace via Fortran’s link-at-runtime capability.

The macro commands bundle a lot of functionality into a single subroutine call. So much, in fact, that it is sometimes unclear to a naive user what all the effects of the call will be. However, the macro calls are well thought out, so the best way to learn McFace is to just dive in and try running and modifying the sample programs that are included. When I did not understand all the effects of a call to McFace, I got unexpected behavior, but no crashes.

Text output is limited to <32K because of the use of Text Edit Records in the text output windows. Some operations, such as Text Output, are slower with McFace than with a straight Fortran program. Speed is still acceptable, however.

I think the “macro” commands in McFace should not accessed by number. Instead, I think there should be a parameter file which uses the Fortran PARAMETER statement to define symbolic equivalents to the macro numbers. This is exactly what is done in all the Fortran include files for Toolbox access. In early revisions of McFace there have already been inconsistent changes in the macro numbers between versions, which caused me to recode some of my programs. Use of a PARAMETER file would have made converting between revisions completely transparent. Use of parameters would also make McFace calls more self documenting. A PARAMETER file should at least be included as an option for the user.

Except for the size of McFace, and possibly, the use of parameters, these are only minor quibbles. The author, Dan Kampmeier is constantly improving McFace and adding features and functionality. He readily responds to input from users. Most of the deficencies of Fortran for Macintosh programming are eliminated by McFace. [Thank you Dan Kampmeier, for doing Microsoft’s job! Between McFace and the CLR Libraries, maybe Microsoft will learn how to they SHOULD have done their programming products! -Ed]

Summary

McFace is a single external subroutine that acts as a Fortran “extender”. With very little effort generic Fortran programs can be converted to run with a full Mac interface.

The outstanding feature of McFace is its simplicity of use. The major drawback is the 134K of size that it adds to an application. However, this subroutine handles almost all of the Toolbox programming that you will ever need to do from Fortran.

Conversion of existing Fortran code to a Mac interface can almost be reduced to a cookbook translation process, at least for a first iteration. Fine tuning and addition of features is simple and is added by McFace’s ability to work with user designed resources. In short, if you have been frustrated by the difficulty of writing true Mac applications in Fortran, then McFace will probably solve your problems.

McFace is available from Dan Kampmeier or Tensor labs. There is probably an advertisement for it in this issue of MacTutor.

{1}
Listing 1
*
*       Sieve of Eratosthenes
*
        logical*2 flags(8191)
        integer*2 i,j,k,count,iter,prime
        n = long(362)                   ! 60 Hz counter
        do 92 iter = 1,10
           count=0
           i=0
           do 10 i = 1,8191
10            flags(i) = .true.
           do 91 i = 1,8191
              if (.not. flags(i)) go to 91
              prime = i + i + 3
              count = count + 1
              k = i + prime
              if (k .gt. 8191) go to 91
              do 60 j = k, 8191, prime
60               flags(j) = .false.
91          continue
92      continue
        write (9,*) count,” primes in”,(long(362)-n)/60.0,” seconds”
        pause
        end

Screen 1

{2}
Listing 2
*       Sieve of Eratosthenes
*
        logical*2 flags(8191)
        integer*2 i,j,k,count,iter,prime
c
c McFace Initialization Code
    include HFS VOLUME:FORTRAN 2.2:INCLUDE FILES:McVariables
    storage(232) = 10240!at least 10K of memory for stack expansion
    storage(240) = 3        !up to 5 text editors
    MAC = “About Sieve...”   !”About Program”
    call McFace(0,2,-6,0,0,0,0,0,0,0,0)     !initialize variables
c
c bring up editor #1, move insertion bar to end,return without reading:
        call McFace(0,4,2,3,2,2,-6,0,0,0,0)
c
c The code that does the work
        n = long(362)                   ! 60 Hz counter
        do 92 iter = 1,10
           count=0
           i=0
           do 10 i = 1,8191
10            flags(i) = .true.
           do 91 i = 1,8191
              if (.not. flags(i)) go to 91
              prime = i + i + 3
              count = count + 1
              k = i + prime
              if (k .gt. 8191) go to 91
              do 60 j = k, 8191, prime
60               flags(j) = .false.
91          continue
92      continue
        write (MAC,198) count,(long(362)-n)/60.0
198     FORMAT(I6, ‘ primes in ‘, f4.2, ‘ seconds’)
        call McFace(-1,2,-6,0,0,0,0,0,0,0,0)
        pause
        end
c
c Include McFace Variables
        include HFS VOLUME:FORTRAN 2.2:INCLUDE FILES:McMemory

Screen 2

{3}
Listing 3
*   McFace Shell to run
*   Sieve of Eratosthenes example
       integer*2 nprimes
c
c  McFace Initialization Code
 include HFS VOLUME:FORTRAN 2.2:INCLUDE FILES:McVariables
 storage(232) = 20240 !at least 20K of memory for stack              
 
 storage(240) = 3  !up to 2 text editors
   MAC = “About Sieve...”  !”About Program” 
   call McFace(0,2,-6,0,0,0,0,0,0,0,0) !initialize variables
c
c  Add a custom menu for the Sieve
   file = ‘Sieve’
   MAC = ‘Do Sieve;Write Test’
   call McFace(0,-1,0,2,-6,0,0,0,0,0,0)
c
c  bring up editor #1, move insertion bar to end,
c  and return without reading:
   call McFace(0,4,2,3,2,2,-6,0,0,0,0)
c
c  Loop that just waits for menu command
   do
 call McFace(0,0,0,0,0,0,0,0,0,0,0)
   select case (MAC)
 case(‘About’)    !open “About “ alert call McFace(0,10,4,0,0,0,0,0,0,0,0)
       case(‘Do Sieve’)
     n1 = long(362)  ! 60 Hz counter. Start
        call Sieve(nprimes)
     n2 = long(362)   ! 60 Hz counter. Stop
     deltat = (n2-n1)/60.0
        write (MAC,198) nprimes, deltat
198 FORMAT(I6, ‘ primes in ‘, f4.2, ‘ seconds’)
        call McFace(-1,4,2,2,-6,0,0,0,0,0,0)
 case default

    end select
   repeat
   end
c       Sieve of Eratosthenes subroutine
c       Just generic Fortran code, converted to a subroutine

        subroutine Sieve(count)
        logical*2 flags(8191)
        integer*2 i,j,k,count,iter,prime
        n = long(362)                   ! 60 Hz counter
        do 92 iter = 1,10
           count=0
           i=0
           do 10 i = 1,8191
10            flags(i) = .true.
           do 91 i = 1,8191
              if (.not. flags(i)) go to 91
              prime = i + i + 3
              count = count + 1
              k = i + prime
              if (k .gt. 8191) go to 91
              do 60 j = k, 8191, prime
60               flags(j) = .false.
91          continue
92      continue
 dt = (long(362)-n)/60.0
 return
        end
   include HFS VOLUME:FORTRAN 2.2:INCLUDE FILES:McMemory
 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Live Home 3D Pro 3.6.2 - $49.99
Live Home 3D Pro is powerful yet intuitive home design software that lets you build the house of your dreams right on your Mac, iPhone or iPad. It has every feature of Live Home 3D, plus some... Read more
RapidWeaver 8.2 - Create template-based...
RapidWeaver is a next-generation Web design application to help you easily create professional-looking Web sites in minutes. No knowledge of complex code is required, RapidWeaver will take care of... Read more
Opera 60.0.3255.109 - High-performance W...
Opera is a fast and secure browser trusted by millions of users. With the intuitive interface, Speed Dial and visual bookmarks for organizing favorite sites, news feature with fresh, relevant content... Read more
DEVONthink Pro 3.0beta2 - Knowledge base...
DEVONthink Pro is your essential assistant for today's world, where almost everything is digital. From shopping receipts to important research papers, your life often fills your hard drive in the... Read more
Tunnelblick 3.7.9 - GUI for OpenVPN.
Tunnelblick is a free, open source graphic user interface for OpenVPN on OS X. It provides easy control of OpenVPN client and/or server connections. It comes as a ready-to-use application with all... Read more
Carbon Copy Cloner 5.1.9 - Easy-to-use b...
Carbon Copy Cloner backups are better than ordinary backups. Suppose the unthinkable happens while you're under deadline to finish a project: your Mac is unresponsive and all you hear is an ominous,... Read more
Dropbox 73.4.118 - Cloud backup and sync...
Dropbox is an application that creates a special Finder folder that automatically syncs online and between your computers. It allows you to both backup files and keeps them up-to-date between systems... Read more
Postbox 6.1.18 - Powerful and flexible e...
Postbox is a new email application that helps you organize your work life and get stuff done. It has all the elegance and simplicity of Apple Mail, but with more power and flexibility to manage even... Read more
Wireshark 3.0.2 - Network protocol analy...
Wireshark is one of the world's foremost network protocol analyzers, and is the standard in many parts of the industry. It is the continuation of a project that started in 1998. Hundreds of... Read more
BetterTouchTool 2.856 - Customize multi-...
BetterTouchTool adds many new, fully customizable gestures to the Magic Mouse, Multi-Touch MacBook trackpad, and Magic Trackpad. These gestures are customizable: Magic Mouse: Pinch in / out (zoom... Read more

AFK Arena guide - Everything you need to...
Ok, so if you're like me, you've been playing (and sometimes waiting) your way through AFK Arena, only to learn there's a lot more to it than there appears on the surface. There's guilds, a PvP arena, and all sorts of other systems and game modes... | Read more »
Explore an epic fantasy world in MMORPG...
Webzen have just announced the official launch date for its stunning MMORPG ‘MU Origin 2’ which will arrive for iOS and Android on May 28th. It will be the second spinoff from the classic PC-based MU Online, and it looks to further refine the... | Read more »
Solar Explorer: New Dawn guide - Tips an...
Solar Explorer: New Dawn is a lunar lander game that really ratchets the intensity up to 11. With all of the asteroids flying around as you fly around at seemingly breakneck speeds, it can be easy to feel overwhelmed bythe whole thing. | Read more »
The Dalaran Heist - How Hearthstone...
I am someone who wrote Hearthstone off a while ago. It was hard not to try and stick with it. The game has incredible production values and a core of really great talent working on the game continuously to keep it feeling fresh and fun (full... | Read more »
Steam Link App - Everything You Need to...
Steam Link has finally released for iOS! That’s right, you can play your epic backlog of PC games on the go now. Well… sort of. While the Steam Link app was announced seemingly ages ago, it only got actual approval for release last night. Check out... | Read more »
Pre-register now for endless superhero r...
Talking Tom Hero Dash is set to take the ever-popular Talking Tom and Friends franchise in a brand new direction as it opens pre-registration to players worldwide. Not only does it promise to be a beautifully rendered, fast-paced, action-packed... | Read more »
AFK Arena - Guild Wars guide
Ok, so if you're like me, you've been playing (and sometimes waiting) your way through AFK Arena, only to learn there's a lot more to it than there appears on the surface. There's guilds, a PvP arena, and all sorts of other systems and game modes... | Read more »
Superhero-themed Talking Tom Hero Dash i...
One of the exciting releases that we’re looking forward to is Talking Tom Hero Dash, an upcoming superhero-themed runner created by Outfit7. This new game is an action-packed endless runner that takes you on an epic adventure to assemble the... | Read more »
Kingdom Rush Vengeance Update Guide 2 -...
Kingdom Rush: Vengeance just got updated once again to add more content to the game. This addition, called The Frozen Nightmare, adds three new levels, five new enemies, two new heroes, and some new achievements. | Read more »
Save the world with SCIENCE in the upcom...
Previous versions of space colonization game TerraGenesis encouraged you to explore the galaxy and settle its planets. The eagerly-awaited 5.0 update will try to smash them to bits. Yep, with a new "world killers" setting, you can unleash... | Read more »

Price Scanner via MacPrices.net

12″ 1.2GHz MacBooks on sale for $999, $300 of...
Amazon has current-generation 12″ 1.2GHz Retina MacBooks on sale for $300 off Apple’s MSRP. Shipping is free: 12″ 1.2GHz Space Gray MacBook: $999.99 $300 off MSRP 12″ 1.2GHz Silver MacBook: $999.99 $... Read more
Here’s how to save $200 on Apple’s new 8-Core...
Apple has released details of their Education discount associated with the new 2019 15″ 6-Core and 8-Core MacBook Pros. Take $200 off the price of the new 8-Core model (now $2599) and $150 off the 15... Read more
Price drops! 2018 15″ 2.2GHz 6-Core MacBook P...
Amazon has dropped prices on clearance 2018 15″ 2.2GHz 6-Core Touch Bar MacBook Pros by $300 with models now available for $2099. These are the same models sold by Apple in their retail and online... Read more
Apple drops prices on 2018 13″ 2.3GHz Quad-Co...
Apple has dropped prices on Certified Refurbished 2018 13″ 2.3GHz 4-Core Touch Bar MacBook Pros with prices now starting at $1489. Apple’s one-year warranty is included, shipping is free, and each... Read more
Apple drops prices on 2018 Certified Refurbis...
Apple has dropped prices on clearance 2018 15″ 6-Core Touch Bar MacBook Pro, Certified Refurbished, with models available starting at only $1999. Each model features a new outer case, shipping is... Read more
Price drops! Clearance 2018 13″ Quad Core Mac...
Amazon has dropped prices on 2018 13″ Apple Quad-Core MacBook Pros with models now available for $250 off original MSRP. Shipping is free. Select Amazon as the seller, rather than a third-party, to... Read more
How Much Is ‘Solace’ Of Mind Worth When Buyin...
COMMENTARY: 05.22.19- Smartphone cases give us peace of mind by providing ample protection for such a fragile gadget and the sky’s the limit as far as choices go with a plethora of brands, styles,... Read more
Get a 13″ Touch Bar MacBook Pro for the lowes...
Apple has Certified Refurbished 2017 13″ 3.1GHz Dual-Core i5 Touch Bar MacBook Pros available starting at $1439, ranging up to $390 off original MSRP. Each MacBook features a new outer case, shipping... Read more
Apple adds new 15″ 8-Core MacBook Pro to line...
Apple has added a new 15″ MacBook Pro to its lineup featuring a 9th generation 2.3GHz 8-Core Intel i9 processor, 16GB of RAM, a 512GB SSD, and a Radeon Pro 560X with 4GB of GDDR5 memory for $2799.... Read more
21″ 2.3GHz iMac available for $999 at B&H...
B&H Photo has the 2018 21″ 2.3GHz Apple iMac on sale for $100 off MSRP. This is the same model offering by Apple in their retail and online stores. Shipping is free: – 21″ 2.3GHz iMac (MMQA2LL/A... Read more

Jobs Board

Best Buy *Apple* Computing Master - Best Bu...
**690427BR** **Job Title:** Best Buy Apple Computing Master **Job Category:** Sales **Location Number:** 000860-Charlottesville-Store **Job Description:** **What Read more
*Apple* Mobile Master - Best Buy (United Sta...
**696430BR** **Job Title:** Apple Mobile Master **Job Category:** Store Associates **Location Number:** 001012-Bismarck-Store **Job Description:** **What does a Best Read more
Manager - *Apple* Team - SHI International...
…opportunity available in the Hardware & Advanced Solutions Department as the Manager of the Apple Team The Manager must be familiar with all aspects of Apple Read more
Best Buy *Apple* Computing Master - Best Bu...
**696375BR** **Job Title:** Best Buy Apple Computing Master **Job Category:** Sales **Location Number:** 000203-North Austin-Store **Job Description:** **What does a Read more
Geek Squad *Apple* Master Consultation Agen...
**696286BR** **Job Title:** Geek Squad Apple Master Consultation Agent **Job Category:** Services/Installation/Repair **Location Number:** 000172-Rivergate-Store Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.