/*
* cook - file construction tool
* Copyright (C) 1997-1999, 2007, 2008 Peter Miller
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see
* .
*
* This file presents users with some useful functions, defined in terms
* of the built-in functions. While useful, they also serve as examples
* of how to write your own functions.
*
* See the ``Functions'' section of the Cook User Guide for more
* information. ([arg] and [@1] to [@9] are local variables.)
*/
/*
* NAME
* capitalize
*
* SYNOPSIS
* [capitalize ...]
*
* DESCRIPTION
* The capitalize function maps all of its arguments into lower
* case, and then the first letter of each argument is mapped to
* upper case. Zero, one or more arguments may be given.
*/
function capitalize =
{
@1 = ;
@2 = [downcase [arg]];
loop
{
if [not [count [@2]]] then
loopstop;
@3 = [head [@2]];
@2 = [tail [@2]];
@1 = [@1] [upcase [substr 1 1 [@3]]][substr 2 9999 [@3]];
}
return [@1];
}
/*
* NAME
* defined-or-null
*
* SYNOPSIS
* [defined-or-null ]
*
* DESCRIPTION
* The defined-or-null function may be used to determine if a
* variable has been set (on the command line, for example) and
* return its value if so, otherwise return the empty list.
*
* ARGUMENTS
* This function should only be given one argument - the name of
* the variable to look for. Additional arguments will be ignored.
* Too few arguments will produce a complaint about the "" variable
* being undefined.
*
* RETURNS
* The value of the named variable, or the empty list if the
* variable is not defined.
*/
function defined-or-null =
{
if [defined [@1]] then
return [[@1]];
return;
}
/*
* NAME
* defined-or-default
*
* SYNOPSIS
* [defined-or-default ... ]
*
* DESCRIPTION
* The defined-or-default function may be used to determine if a
* variable has been set (on the command line, for example) and
* return its value if so, otherwise return the given default value.
*
* ARGUMENTS
* The first argument is the name of the variable to look for.
*
* The second and later arguments (if present) are the default
* value to be used if the named variable is not defined. Optional.
*
* RETURNS
* The value of the named variable, or the default list if the
* variable is not defined.
*/
function defined-or-default =
{
if [defined [@1]] then
return [[@1]];
return [tail [arg]];
}
/*
* NAME
* repeat
*
* SYNOPSIS
* [repeat ... ]
*
* DESCRIPTION
* The repeat function is used to repeatedly call another function,
* once for each of the specified arguments. The can be useful
* when dealing with functions which do not automaticly accept
* argument lists in the form you require.
*
* There are many instances where the repeat function call be used
* to elegantly avoid used to the ``loop { loopstop }'' construct.
*
* ARGUMENTS
* The first argument is the name of the function you want called.
* This function must accept a single argument.
*
* The second and subsequent arguments are argument values to be
* passed to the named function, one at a time.
*
* RETURNS
* The results of the invocations of the function are accumulated
* in the order in which they were calculated. The accumulated
* results are returned.
*/
function repeat =
{
@2 = ;
@3 = [tail [arg]];
loop
{
if [not [count [@3]]] then
loopstop;
@4 = [head [@3]];
@3 = [tail [@3]];
/* run the named function on this argument */
@2 = [@2] [[@1] [@4]];
}
return [@2];
}
/*
* NAME
* variable_by_path
*
* SYNOPSIS
* [variable_by_path target prefix filename]
*
* DESCRIPTION
* The variable_by_path function is used to extract the union
* of option settings relevant to a particular compilation or link.
* By using a variable suffix, this function may be used to obtain
* the setting of a wide variety of options and commands.
*
* SIDE EFFECTS
* Global variables are searched in a no particular order for the
* necessary information. All are searched, all found are used.
*
* e.g. [variable_by_path cc_flags foo/bar/baz.c]
* will hunt for variables with the following names:
* cc_flags_foo/bar/baz.c
* cc_flags_foo/bar
* cc_flags_foo
* cc_flags
*
* It is expected that the vast majority of these variables will
* not be set. It will NOT hunt for cc_flags by itself.
*
* Duplicates are removed.
*
* ARGUMENTS
* The arguments are available in temporary variables numbered
* by argument. The function does not check that you supplied all
* of the arguments. Caveat emptor.
*
* @1 The variable name prefix to use.
* @2 The filename to be dismembered.
*/
function variable_by_path =
{
@9 = ; /* empty result */
if [defined [@1]] then
@9 = [[@1]];
@8 = [split / [@2]];
@6 = 1 2 3 4 5 6 7 8 9;
loop
{
if [not [count [@6]]] then
loopstop;
@7 = [head [@6]];
@6 = [tail [@6]];
/* build the variable name */
@3 = [@1]_[unsplit / [wordlist 1 [@7] [@8]]];
/* use the variable if it's defined */
if [defined [@3]] then
@9 = [@9] [[@3]];
}
/* remove duplicates and return */
return [stringset [@9]];
}
function first_variable_by_path =
{
@9 = ; /* empty result */
@8 = [split / [@2]];
@6 = 1 2 3 4 5 6 7 8 9;
loop
{
if [not [count [@6]]] then
loopstop;
@7 = [head [@6]];
@6 = [tail [@6]];
/* build the variable name */
@3 = [@1]_[unsplit / [wordlist 1 [@7] [@8]]];
/* use the variable if it's defined */
if [defined [@3]] then {
return [[@3]];
}
}
if [defined [@1]] then{
return [[@1]];
}
/* remove duplicates and return */
return [@9];
}
function oneline =
{
return [catenate [head [arg]] [addprefix " " [tail [arg]]]];
}
/*change contents to lower, upper or leave as mixed case*/
function lum = {
if [configuring] then return;
if [in [fc_mod_case] lower] then
return [downcase [arg]];
else if [in [fc_mod_case] upper] then
return [upcase [arg]];
else if [in [fc_mod_case] mixed] then
return [arg];
else
function print ****************************************************;
function print "INVALID COMPILER CONFIGURATION";
function print "fc_module_case="[fc_mod_case];
function print "Valid values: lower|upper|mixed";
function print ****************************************************;
fail;
}