zsh-workers
 help / color / mirror / code / Atom feed
From: Andrew Main <zefram@tao.co.uk>
To: mason@primenet.com.au
Cc: zsh-workers@math.gatech.edu
Subject: Re: make zsh falls over (fwd)
Date: Mon, 4 Aug 1997 17:01:04 +0100 (BST)	[thread overview]
Message-ID: <199708041601.RAA16238@taos.demon.co.uk> (raw)
In-Reply-To: <slrn5ubi8v.i68.mason@coral.primenet.com.au> from "Geoff Wing" at Aug 4, 97 12:20:47 pm

Geoff Wing wrote:
>Ummm, how?  None of the versions I have have makepro.awk .  What version is
>this from?  Have I been asleep and this has suddenly appeared?

It was in one of the more recent patches I sent.  It isn't in any
official releases yet.  The script is included below.

-zefram

#
# $Id$
#
# makepro.awk - generate prototype lists
# mostly by Andrew Main
# based on makepro.sed by Mark Weaver <Mark_Weaver@brown.edu>
#

BEGIN {
    aborting = 0

    # arg 1 is the name of the file to process
    # arg 2 is the name of the subdirectory it is in
    if(ARGC != 3) {
	aborting = 1
	exit 1
    }
    name = ARGV[1]
    gsub(/^.*\//, "", name)
    gsub(/\.c$/, "", name)
    name = ARGV[2] "_" name
    gsub(/\//, "_", name)
    ARGC--

    # `locals' is a list of local declarations, built up while global
    # declarations are output.
    locals = ""

    printf "#ifndef have_%s_globals\n", name
    printf "#define have_%s_globals\n", name
    printf "\n"
}

# all relevant declarations are preceded by "/**/" on a line by itself

/^\/\*\*\/$/ {
    # The declaration is on following lines.  The interesting part might
    # be terminated by a `{' (`int foo(void) { }' or `int bar[] = {')
    # or `;' (`int x;').
    line = ""
    isfunc = 0
    while(1) {
	if(getline <= 0) {
	    aborting = 1
	    exit 1
	}
	gsub(/\t/, " ")
	line = line " " $0
	gsub(/\/\*([^*]|\*+[^*\/])*\*+\//, " ", line)
	if(line ~ /\/\*/)
	    continue
	# If it is a function definition, note so.
	if(line ~ /\) *{.*$/) #}
	    isfunc = 1
	if(sub(/ *[{;].*$/, "", line)) #}
	    break
    }
    # Put spaces around each identifier.
    while(match(line, /[^_0-9A-Za-z ][_0-9A-Za-z]/) ||
	    match(line, /[_0-9A-Za-z][^_0-9A-Za-z ]/))
	line = substr(line, 1, RSTART) " " substr(line, RSTART+1)
    # Separate declarations into a type and a list of declarators.
    # In each declarator, "@{" and "@}" are used in place of parens to
    # mark function parameter lists, and "@!" is used in place of commas
    # in parameter lists.  "@<" and "@>" are used in place of
    # non-parameter list parens.
    gsub(/ _ +/, " _ ", line)
    while(1) {
	if(isfunc && match(line, /\([^()]*\)$/))
	    line = substr(line, 1, RSTART-1) " _ (" substr(line, RSTART) ")"
	else if(match(line, / _ \(\([^,()]*,/))
	    line = substr(line, 1, RSTART+RLENGTH-2) "@!" substr(line, RSTART+RLENGTH)
	else if(match(line, / _ \(\([^,()]*\)\)/))
	    line = substr(line, 1, RSTART-1) "@{" substr(line, RSTART+5, RLENGTH-7) "@}" substr(line, RSTART+RLENGTH)
	else if(match(line, /\([^,()]*\)/))
	    line = substr(line, 1, RSTART-1) "@<" substr(line, RSTART+1, RLENGTH-2) "@>" substr(line, RSTART+RLENGTH)
	else
	    break
    }
    sub(/^ */, "", line)
    match(line, /^((const|enum|static|struct|union) +)*([_0-9A-Za-z]+ +|((char|double|float|int|long|short|unsigned|void) +)+)((const|static) +)*/)
    dtype = substr(line, 1, RLENGTH)
    sub(/ *$/, "", dtype)
    islocal = " " dtype " " ~ / static /
    line = substr(line, RLENGTH+1) ","
    # Handle each declarator.
    output = ""
    while(match(line, /^[^,]*,/)) {
	# Separate out the name from the declarator.  Use "@+" and "@-"
	# to bracket the name within the declarator.  Strip off any
	# initialiser.
	dcltor = substr(line, 1, RLENGTH-1)
	line = substr(line, RLENGTH+1)
	sub(/=.*$/, "", dcltor)
	match(dcltor, /^([^_0-9A-Za-z]| const )*/)
	dcltor = substr(dcltor, 1, RLENGTH) "@+" substr(dcltor, RLENGTH+1)
	match(dcltor, /^.*@\+[_0-9A-Za-z]+/)
	dcltor = substr(dcltor, 1, RLENGTH) "@-" substr(dcltor, RLENGTH+1)
	dnam = dcltor
	sub(/^.*@\+/, "", dnam)
	sub(/@-.*$/, "", dnam)

	# Put parens etc. back
	gsub(/@{/, " _((", dcltor)
	gsub(/@}/, "))", dcltor)
	gsub(/@</, "(", dcltor)
	gsub(/@>/, ")", dcltor)
	gsub(/@!/, ",", dcltor)

	# If this is a module boot/cleanup function, conditionally rename it.
	if(" " dtype " " ~ / int / && dcltor ~ / *@\+(boot|cleanup)_[_0-9A-Za-z]+@- *_\(\( *Module +[_0-9A-Za-z]+ *\)\) */) {
	    modtype = dnam
	    sub(/_.*$/, "", modtype)
	    output = output "# if defined(DYNAMIC_NAME_CLASH_OK) && defined(MODULE)\n"
	    output = output "#  define " dnam " " modtype "_\n"
	    output = output "# endif\n"
	}

	# Format the declaration for output
	dcl = dtype " " dcltor ";"
	if(!islocal)
	    dcl = "extern " dcl
	gsub(/@[+-]/, "", dcl)
	gsub(/ +/, " ", dcl)
	while(match(dcl, /[^_0-9A-Za-z] ./) || match(dcl, /. [^_0-9A-Za-z]/))
	    dcl = substr(dcl, 1, RSTART) substr(dcl, RSTART+2)
	output = output dcl "\n"
    }

    # Output global declarations now, but save up locals until the end.
    if(islocal)
	locals = locals output
    else
	printf "%s", output
}

END {
    if(aborting)
	exit 1
    printf "\n"
    printf "#endif /* !have_%s_globals */\n", name
    if(locals != "") {
	printf "\n"
	printf "#ifndef GLOBAL_PROTOTYPES\n"
	printf "\n"
	printf locals
	printf "\n"
	printf "#endif /* !GLOBAL_PROTOTYPES */\n"
    }
}

### end


      reply	other threads:[~1997-08-04 16:08 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1997-08-04 11:37 Giles Constant
1997-08-04 12:20 ` Geoff Wing
1997-08-04 16:01   ` Andrew Main [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=199708041601.RAA16238@taos.demon.co.uk \
    --to=zefram@tao.co.uk \
    --cc=mason@primenet.com.au \
    --cc=zsh-workers@math.gatech.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).