"Cause a little auk awk
goes a long way."

 »  table of contents
 »  featured topics
 »  page tags

About Awk
 »  advocacy
 »  learning
 »  history
 »  Wikipedia entry
 »  mascot
 »  Awk (rarely used)
 »  Nawk (the-one-true, old)
 »  Gawk (widely used)
 »  Mawk
 »  Xgawk (gawk + xml + ...)
 »  Spawk (SQL + awk)
 »  Jawk (Awk in Java JVM)
 »  QTawk (extensions to gawk)
 »  Runawk (a runtime tool)
 »  platform support
 »  one-liners
 »  ten-liners
 »  tips
 »  the Awk 100
 »  read our blog
 »  read/write the awk wiki
 »  discussion news group

 »  Gawk
 »  Xgawk
 »  the Lawker library
Online doc
 »  reference card
 »  cheat sheet
 »  manual pages
 »  FAQ

 »  articles
 »  books:


Mar 01: Michael Sanders demos an X-windows GUI for AWK.

Mar 01: Awk100#24: A. Lahm and E. de Rinaldis' patent search, in AWK

Feb 28: Tim Menzies asks this community to write an AWK cookbook.

Feb 28: Arnold Robbins announces a new debugger for GAWK.

Feb 28: Awk100#23: Premysl Janouch offers a IRC bot, In AWK

Feb 28: Updated: the AWK FAQ

Feb 28: Tim Menzies offers a tiny content management system, in Awk.

Jan 31: Comment system added to For example, see discussion bottom of ?keys2awk

Jan 31: Martin Cohen shows that Gawk can handle massively long strings (300 million characters).

Jan 31: The AWK FAQ is being updated. For comments/ corrections/ extensions, please mail

Jan 31: Martin Cohen finds Awk on the Android platform.

Jan 31: Aleksey Cheusov released a new version of runawk.

Jan 31: Hirofumi Saito contributes a candidate Awk mascot.

Jan 31: Michael Sanders shows how to quickly build an AWK GUI for windows.

Jan 31: Hyung-Hwan Chung offers QSE, an embeddable Awk Interpreter.

[More ...]

Bookmark and Share

categories: Awk100,Oo,Dsl,May,2009,AlexS

Awk + ANSI-C = OO


ooc is an awk program which reads class descriptions and performs the routine coding tasks necessary to do object-oriented coding in ANSI C.

The tool is exceptionally well documented in Object oriented programming with ANSI-C.


Download a 2002 copy of this code from LAWKER.

Or go to the author's web site.


ooc is a technique to do object-oriented programming (classes, methods, dynamic linkage, simple inheritance, polymorphisms, persistent objects, method existence testing, message forwarding, exception handling, etc.) using ANSI-C.

ooc is a preprocessor to simplify the coding task by converting class descriptions and method implementations into ANSI-C as required by the technique. You implement the algorithms inside the methods and the ooc preprocessor produces the boilerplate.

ooc consists of a shell script driving a modular awk script (with provisions for debugging), a set of reports -- code generation templates -- interpreted by the script, and the source of a root class to provide basic functionality. Everything is designed to be changed if desired. There are manual pages, lots of examples, among them a calculator based on curses and X11, and you can ask me about the book.

ooc as a technique requires an ANSI-C system -- classic C would necessitate substantial changes. The preprocessor needs a healthy Bourne-Shell and "new" awk as described in Aho, Weinberger, and Kernighan's book.

ooc was developed primarily to teach about object-oriented programming without having to learn a new language. If you see how it is done in a familiar setting, it is much easier to grasp the concepts and to know what miracles to expect from the technique and what not. Conceivably, the preprocessor can be used for production programming but this was not the original intent. Being able to roll your own object-oriented coding techniques has its possibilities, however...

Technical Details

Most sources should be viewed with tab stops set at 4 characters.

The original system ran on NeXTSTEP 3.2 and older, ESIX (System V) 4.0.4, and Linux 0.99.pl4-49. This rerelease was tested on MacOS X version 10.1.2 and Solaris version 5.8. You need to review paths in the script 'ooc/ooc' before running anything. Make sure the first line of this script points to a Bourne-style shell. Also make sure that the first line of '09/munch' points to a (new) awk.

The rereleased 'ooc' awk-programs have been tested with GNU awk versions 3.0.1 and 3.0.3. Previous versions did not support AWKPATH properly (but this is not essential).

The makefiles could be smarter but they are naive enough for all systems. This is a heterogeneous system -- set the environment variable $OSTYPE to an architecture-specific name. 'make' in the current directory will create everything by calling 'make' in the various subdirectories. Each 'makefile' includes 'make/Makefile.$OSTYPE', review your 'make/Makefile.$OSTYPE' before you start.

The following make calls are supported throughout:

make [all]	create examples
make test	[make and] run examples
make clean	remove all but sources
make depend	make dependencies (if makefile.$OSTYPE supports it)

Make dependencies can be built with the -MM option of the GNU C compiler. They are stored in a file 'depend' in each subdirectory. They should apply to all systems. 'makefile.$OSTYPE' may include a target 'depend' to recreate 'depend' -- check 'makefile.darwin1.4' for an example.


The following is a walk through the file hierarchy in the order of the book:

dispatch standard make calls to known directories
Makefile: boilerplate code for makefiles
chapter 1: abstract data types
  • sets: Set demo
  • bags: Bag demo: Set with reference count
chapter 2: dynamic linkage
  • strings: String demo
  • atoms: Atom demo: unique String
chapter 3: manipulating expressions with dyn. linkage
  • postfix: postfix output of expression
  • value: expression evaluation
  • infix: infix output of expression
chapter 4: inheritance
  • points: Point demo
  • circles: Circle demo: Circle: Point with radius
chapter 5: symbol table with inheritance
  • value: expression evaluation with vars, consts, functions
chapter 6: class hierarchy and meta classes
  • any: objects that do not differ from any object
chapter 7: ooc preprocessor; use ooc -7
  • points: Point demo: PointClass is a new metaclass
  • circles: Circle demo: Circle is a new class
  • queue: Queue demo: List is an abstract base class
  • stack: Stack demo: another subclass of List
chapter 8: dynamic type checking; use ooc -8
  • circles: Circle demo: nothing changed
  • list: List demo: traps insertion of numbers or strings
chapter 9: automatic initialization; use ooc -9
  • munch: awk program to collect class list from nm -p output
  • circles: Circle demo: no more init calls
  • list: List demo: no more init calls
chapter 10: respondsTo method; use ooc -10
  • cmd: Filter demo: how flags and options are handled
  • wc: word count filter
  • sort: sorting filter, adds sort method to List
chapter 11: class methods
  • value: expression evaluator, based on class hierarchy
  • value: x memory reclamation enabled
chapter 12: persistent objects
  • value: expression evaluator, with save and load
chapter 13: exception handling
  • value: expression evaluator with exception handler
  • except: Exception demo
chapter 14: message forwarding
  • makefile.etc: (naive) generated rules for the library
  • Xapp: resources for X11-based programs
  • hello: LineOut demo: hello, world
  • button: Button demo
  • run: terminal-oriented calculator
  • cbutton: Crt demo: hello, world changes into a
  • crun: curses-based caluclator
  • xhello: XLineOut demo: hello, world
  • xbutton: XButton demo with XawBox and XawForm
  • xrun: X11-based calculator with callbacks
manual pages
  • *.1: tools
  • *.2: functions
  • *.3: some classes
  • *.4: classes in chapter 14
ooc preprocessor
  • ooc: command script; review 'home' 'OOCPATH' 'AWKPATH'
  • awk/*.awk: modules
  • awk/*.dbg: debugging modules
  • rep/*.rep: reports
  • rep-*/*.rep: reports for early chapters


Copyright (c) 1993

While you may use this software package, neither I nor my employers can be made responsible for whatever problems you might cause or encounter.

While you may give away this package and/or software derived with it, you should not charge for it, you should not claim that ooc is your work, and I have published my own book about ooc before you did.

The same restrictions apply to whoever might get this package from you.


Axel T. Schreiner,
blog comments powered by Disqus