#!/usr/bin/perl

#
#    Copyright (c) 2014-2017 Nest Labs, Inc.
#    All rights reserved.
#
#    Licensed under the Apache License, Version 2.0 (the "License");
#    you may not use this file except in compliance with the License.
#    You may obtain a copy of the License at
#
#        http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS,
#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#    See the License for the specific language governing permissions and
#    limitations under the License.
#

#
#    Description:
#      This file implements a script to parse a version number from
#      the command line, split it into its constituent components, and
#      then auto-generate a C-language header file containing
#      preprocessor mnemonics for those components.
#

use strict 'refs';

use File::Basename;
use Getopt::Long qw(:config gnu_getopt);
use POSIX;
use Time::Piece;

# Global Variables

# Program name

my($program);

# Decoded options

my(%options);

#
# PrintUsage()
#
# Description:
#   This routine prints out the proper command line usage for this
#   program
#
# Input(s):
#   status - Flag determining what usage information will be printed and what
#            the exit status of the program will be after the information is
#            printed.
#
# Output(s):
#   N/A
#
# Returns:
#   This subroutine does not return.
#
sub PrintUsage {
  my($status) = $_[0];

  print(STDERR "Usage: $program [ options ... ] [ -o OUTPUT ] <version>\n");

  if ($status != EXIT_SUCCESS) {
    print(STDERR "Try `$program --help' for more information.\n");
  }

  if ($status != EXIT_FAILURE) {
    my($usage) =
"
General Options:

  -h, --help                 Display this information.

Input and Output Options:

  -o, --output=PATH          Specify PATH as the output file to write with the
                             generated ouput (default: standard output).
";

    print(STDERR $usage);
  }

  exit($status);
}

#
# DecodeOptions()
#
# Description:
#   This routine steps through the command-line arguments, parsing out
#   recognzied options.
#
# Input(s):
#   N/A
#
# Output(s):
#   N/A
#
# Returns:
#   N/A
#
sub DecodeOptions {
  if (!&GetOptions(\%options,
		   "help|h",
		   "output|o=s",
		  )) {
    print(STDERR "option parsing failed!\n");
    PrintUsage(EXIT_FAILURE);
  }

  if ($options{"help"}) {
    PrintUsage(EXIT_SUCCESS);
  }

  # There should be exactly one additional command line argument.

  if (scalar(@ARGV) != 1) {
    PrintUsage(EXIT_FAILURE);
  }

  return;
}

#
# ParseVersion()
#
# Description:
#   This routine accepts 
#   recognzied options.
#
# Input(s):
#   version - A scalar containing the version to parse as a string.
#   major   - A reference to a scalar in which to store the major
#             component of the version, as a scalar.
#   minor   - A reference to a scalar in which to store the minor
#             component of the version, as a scalar.
#   patch   - A reference to a scalar in which to store the patch
#             component of the version, as a scalar.
#   extra   - A reference to a scalar in which to store the "extra"
#             component of the version, as a string.
#
# Output(s):
#   major   - A reference to the major component of the version, as
#             a scalar.
#   minor   - A reference to the minor component of the version, as
#             a scalar.
#   patch   - A reference to the patch component, if present, of the
#             version, as a scalar.
#   extra   - A reference to the "extra" component, if present, of
#             version, as a string.
#
# Returns:
#   N/A
#
sub ParseVersion {
    my($version) = $_[0];
    my($major_ref, $minor_ref, $patch_ref, $extra_ref) = @_[1..$#_];
    my(@components);

    # Attempt to split the version into two required components: major
    # and minor. Patch and "extra" components may be present, those
    # will be handled subseqeuntly.

    @components = split(/\./, ${version}, 2);

    if (@components == 2) {
        my($first, $second, $third);

	# Unconditionally parse the major component, stripping leading
	# white space and any trailing non-digit characters.

	${first} = shift(@components);
	($${major_ref}, $${extra_ref}) = (${first} =~ m/^\s*(\d+).*$/);

	# At this point, we have either a minor component and some
	# optional "extra" or a minor component, patch component, and
	# some optional "extra".

	${second} = shift(@components);
	($${minor_ref}, $${extra_ref}) = (${second} =~ m/^\s*(\d+)(.*)$/);

	if ($${extra_ref} =~ m/^\./) {
	    ($${patch_ref}, $${extra_ref}) = ($${extra_ref} =~ m/^\.\s*(\d+)(.*)$/);
	}
    }
}

#
# Main program body
#

{
    my($oh, $format);

    # Set the program name

    $program = basename($0);

    # Parse options from the command line

    DecodeOptions();

    # At this point, the version to parse should be the only argument.

    my($weave_version) = @ARGV[0];

    # Initialize the output stream.

    if ($options{"output"}) {
        if (open($oh, "+>$options{output}") == 0) {
	    print(STDERR "Could not open \"$options{output}\" for append.\n");
	    exit(EXIT_FAILURE);
	}

    } else {
        $oh = \*STDOUT;

    }

    # Establish the copyright year and script base name scalar variables
    # for substitution in the here document output.

    my($first_year)     = 2014;
    my($current_year)   = Time::Piece->new()->year;
    my($copyright_year) = "${first_year}";

    if (${first_year} < ${current_year}) {
        ${copyright_year} .= "-${current_year}";
    }

    # Establish some reasonable version component defaults.

    my($weave_major) = 0;
    my($weave_minor) = 0;
    my($weave_patch) = 0;
    my($weave_extra) = undef;

    # Attempt to parse the version into its constituent components.

    ParseVersion(${weave_version}, \${weave_major}, \${weave_minor}, \${weave_patch}, \${weave_extra});

    # Canonically recompose the version from its components.

    if (${weave_patch} == 0) {
        ${weave_version} = sprintf("%u.%u%s", ${weave_major}, ${weave_minor}, ${weave_extra});
    } else {
        ${weave_version} = sprintf("%u.%u.%u%s", ${weave_major}, ${weave_minor}, ${weave_patch}, ${weave_extra});
    }

    # Generate the output file as a Perl "here document" with scalar
    # variable interpolation (escaping where necessary).

    my($template) =
"
/*
 *
 *    Copyright (c) ${copyright_year} Nest Labs, Inc.
 *    All rights reserved.
 *
 *    Licensed under the Apache License, Version 2.0 (the \"License\");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an \"AS IS\" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

/**
 *    \@file
 *      This file defines constants and macros for introspecting and
 *      manipulating Weave versions.
 *
 *      !!! WARNING !!! WARNING !!! WARNING !!! WARNING !!!
 *
 *      DO NOT EDIT THIS FILE! This file is automatically-generated by
 *      the '${program}' script.
 *
 *      The constants and macros defined here may be used to, for ,
 *      example, conditionally-compile older, newer, or changed Weave
 *      APIs based on the Weave version. For example:
 *
 *          \@code
 *          #if WEAVE_VERSION_CODE >= WEAVE_VERSION_CODE_ENCODE(1, 5, 0)
 *              ...
 *          #else
 *              ...
 *          #endif
 *          \@endcode
 *
 */

#ifndef WEAVEVERSION_H_
#define WEAVEVERSION_H_

#define _WEAVE_VERSION_CODE_MAJOR_WIDTH     8
#define _WEAVE_VERSION_CODE_MINOR_WIDTH     8
#define _WEAVE_VERSION_CODE_PATCH_WIDTH     8

#define _WEAVE_VERSION_CODE_MAJOR_MASK     ((1 << _WEAVE_VERSION_CODE_MAJOR_WIDTH)  - 1)
#define _WEAVE_VERSION_CODE_MINOR_MASK     ((1 << _WEAVE_VERSION_CODE_MINOR_WIDTH)  - 1)
#define _WEAVE_VERSION_CODE_PATCH_MASK     ((1 << _WEAVE_VERSION_CODE_PATCH_WIDTH)  - 1)

#define _WEAVE_VERSION_CODE_MAJOR_SHIFT    24
#define _WEAVE_VERSION_CODE_MINOR_SHIFT    16
#define _WEAVE_VERSION_CODE_PATCH_SHIFT     8

/**
 *  \@def WEAVE_VERSION_CODE_ENCODE(major, minor, patch)
 *
 *  \@brief
 *    Encode a Weave version code from its constituent \@a major, \@a minor, and \@a patch
 *    components.
 *
 *    This macro may be used in conjunction with WEAVE_VERSION_CODE to, for
 *    example, conditionally-compile older, newer, or changed Weave APIs based
 *    on the Weave version. For example:
 *
 *        \@code
 *        #if WEAVE_VERSION_CODE >= WEAVE_VERSION_CODE_ENCODE(1, 5, 0)
 *            ...
 *        #else
 *            ...
 *        #endif
 *        \@endcode
 *
 */
#define WEAVE_VERSION_CODE_ENCODE(major, minor, patch)                                    \\
    ((((major)  & _WEAVE_VERSION_CODE_MAJOR_MASK)  << _WEAVE_VERSION_CODE_MAJOR_SHIFT)  | \\
     (((minor)  & _WEAVE_VERSION_CODE_MINOR_MASK)  << _WEAVE_VERSION_CODE_MINOR_SHIFT)  | \\
     (((patch)  & _WEAVE_VERSION_CODE_PATCH_MASK)  << _WEAVE_VERSION_CODE_PATCH_SHIFT))

/**
 *  \@def WEAVE_VERSION_CODE_DECODE_MAJOR(code)
 *
 *  \@brief
 *    Decode a Weave major version component from a Weave version \@a code.
 *
 */
#define WEAVE_VERSION_CODE_DECODE_MAJOR(code)  (((code) >> _WEAVE_VERSION_CODE_MAJOR_SHIFT)  & _WEAVE_VERSION_CODE_MAJOR_MASK)

/**
 *  \@def WEAVE_VERSION_CODE_DECODE_MINOR(code)
 *
 *  \@brief
 *    Decode a Weave minor version component from a Weave version \@a code.
 *
 */
#define WEAVE_VERSION_CODE_DECODE_MINOR(code)  (((code) >> _WEAVE_VERSION_CODE_MINOR_SHIFT)  & _WEAVE_VERSION_CODE_MINOR_MASK)

/**
 *  \@def WEAVE_VERSION_CODE_DECODE_PATCH(code)
 *
 *  \@brief
 *    Decode a Weave patch version component from a Weave version \@a code.
 *
 */
#define WEAVE_VERSION_CODE_DECODE_PATCH(code)  (((code) >> _WEAVE_VERSION_CODE_PATCH_SHIFT)  & _WEAVE_VERSION_CODE_PATCH_MASK)

/**
 *  \@def WEAVE_VERSION_MAJOR
 *
 *  \@brief
 *    The Weave version major component, as an unsigned integer.
 *
 */
#define WEAVE_VERSION_MAJOR               ${weave_major}

/**
 *  \@def WEAVE_VERSION_MINOR
 *
 *  \@brief
 *    The Weave version minor component, as an unsigned integer.
 *
 */
#define WEAVE_VERSION_MINOR               ${weave_minor}

/**
 *  \@def WEAVE_VERSION_PATCH
 *
 *  \@brief
 *    The Weave version patch component, as an unsigned integer.
 *
 */
#define WEAVE_VERSION_PATCH               ${weave_patch}

/**
 *  \@def WEAVE_VERSION_EXTRA
 *
 *  \@brief
 *    The Weave version extra component, as a quoted C string.
 *
 */
#define WEAVE_VERSION_EXTRA               \"${weave_extra}\"

/**
 *  \@def WEAVE_VERSION_STRING
 *
 *  \@brief
 *    The Weave version, as a quoted C string.
 *
 */
#define WEAVE_VERSION_STRING              \"${weave_version}\"

/**
 *  \@def WEAVE_VERSION_CODE
 *
 *  \@brief
 *    The Weave version, including the major, minor, and patch components,
 *    encoded as an unsigned integer.
 *
 *    This macro may be used in conjunction with WEAVE_VERSION_CODE_ENCODE
 *    to, for example, conditionally-compile older, newer, or changed Weave
 *    APIs based on the Weave version. For example:
 *
 *        \@code
 *        #if WEAVE_VERSION_CODE >= WEAVE_VERSION_CODE_ENCODE(1, 5, 0)
 *            ...
 *        #else
 *            ...
 *        #endif
 *        \@endcode
 *
 */
#define WEAVE_VERSION_CODE                WEAVE_VERSION_CODE_ENCODE( \\
          WEAVE_VERSION_MAJOR,                                       \\
          WEAVE_VERSION_MINOR,                                       \\
          WEAVE_VERSION_PATCH                                        \\
        )

#endif /* WEAVEVERSION_H_ */
";

    print(${oh} ${template});

    exit(EXIT_SUCCESS);
}






