#! /usr/local/bin/perl
#
# Fixup the index file by making all entries follow the same case rules; 
# also replace any expanded TeX code
#
# Define special names that should not be case converted
%specialnames = ( "MPI_COMM_WORLD" => 1, "MPI_ERRORS_FATAL" => 1,
	          "MPI_COMM_SELF" => 1, "MPICH_TRDUMP" => 1,
		  "MPI_ERRORS_RETURN" => 1, "MPID_tBsend" => 1,
		  "MPID_THREAD_PROVIDED" => 1, "MPI_MAX_INFO_KEY" => 1,
		  "MPI_MAX_INFO_VAL" => 1, "MPI_CART" => 1, 
		  "MPI_GRAPH" => 1, "MPI_CONGRUENT" => 1, 
		  "MPI_SIMILAR" => 1, "MPI_UNDEFINED" => 1,
		  "MPI_UNEQUAL" => 1, "MPI_IDENT" => 1,
		  "MPI_IN_PLACE" => 1, "MPI_ROOT" => 1, 
		  "MPI_REPLACE" => 1,
		  "MPI_ANY_SOURCE" => 1, "MPI_ANY_TAG" => 1, 
		  "MPI_DISTRIBUTE_NONE" => 1,
		  "MPI_INFO_NULL" => 1,
		  "MPI_COMM_NULL" => 1,
		  "MPI_TYPE_NULL" => 1,
		  "MPI_GROUP_NULL" => 1,
		  "MPI_PACKED" => 1,
		  "MPI_KEYVAL_INVALID" => 1,
		  "MPI_MAX_PROCESSOR_NAME" => 1, 
		  "MPI_MAX_KEY_VALUE" => 1,
		  "MPI_MODE_NOCHECK" => 1,
		  "MPI_MODE_NOPRECEDE" => 1,
		  "MPI_MODE_NOPUT" => 1,
		  "MPI_MODE_NOSTORE" => 1,
		  "MPI_MODE_NOSUCCEED" => 1,
		  "MPI_MODE_CREATE" => 1,
		  "MPI_MODE_EXCL" => 1,
		  "MPI_MODE_RDONLY" => 1,
		  "MPI_MODE_RDWR" => 1,
		  "MPI_MODE_SEQUENTIAL" => 1,
		  "MPI_MODE_WRONLY" => 1,
		  "MPI_F_STATUS_IGNORE" => 1,
		  "MPI_F_STATUSES_IGNORE" => 1,
		  "MPI_FILE_NULL" => 1,
		  "MPI_VERSION" => 1, "MPI_SUBVERSION" => 1,
		  "MPI_STATUS_IGNORE" => 1,
		  "MPI_THREAD_SERIALIZED" => 1,
		  "MPI_TYPECLASS_COMPLEX" => 1,
		  "MPI_TYPECLASS_INTEGER" => 1,
		  "MPI_TYPECLASS_REAL" => 1,
		  "MPI_WIN_SIZE" => 1, "MPI_WIN_BASE" => 1,
		  "MPI_WIN_DISP_UNIT" => 1, "MPI_SUCCESS" => 1,
		  "MPI_STATUSES_IGNORE" => 1,
		  "MPID_WIN_CONST_BASE" => 1, "MPID_WIN_CONST_DISP" => 1,
		  "MPID_WIN_NO_LOCKS" => 1, "MPID_COUNT_MSG_CANCELLED" => 1,
		  "MPI_ERROR" => 1, "MPI_IO" => 1,
		  "MPIi_ERR_BUFFER_NULL" => 1,
		  "MPIi_ERR_BUFFER_NOSPACE" => 1,
		  "MPIi_ERR_BUFFER_ALIAS" => 1,
		  "MPIi_ERR_BUFFER_SIZE" => 1,
		  "MPIi_ERR_BUFFER_BSEND_EXISTS" => 1,
		  "MPIi_ERR_BUFFER_BSEND_SMALL" => 1,
		  "MPIi_ERR_BUFFER_BSEND_NONE" => 1,
		  "MPIi_ERR_COUNT_ARRAY" => 1,
		  "MPIi_ERR_TYPE_NULL" => 1,
		  "MPIi_ERR_TYPE_ARRAY_NULL" => 1,
		  "MPIi_ERR_TYPE_NOT_COMMITTED" => 1,
		  "MPIi_ERR_TYPE_FREE_PERM" => 1,
		  "MPIi_ERR_TYPE_NAME" => 1,
		  "MPIi_ERR_TYPE_NOMATCH" => 1,
		  "MPIi_ERR_TYPE_WRONG_COMM" => 1,
		  "MPIi_ERR_COMM_NULL" => 1,
		  "MPIi_ERR_COMM_INTER" => 1,
		  "MPIi_ERR_COMM_INTRA" => 1,
		  "MPIi_ERR_COMM_NAME" => 1,
		  "MPIi_ERR_COMM_PEER" => 1,
		  "MPIi_ERR_COMM_LOCAL_NULL" => 1,
		  "MPIi_ERR_RANK_ARRAY" => 1,
		  "MPIi_ERR_RANK_DUP" => 1,
		  "MPIi_ERR_RANK_LOCAL" => 1,
		  "MPIi_ERR_RANK_REMOTE" => 1,
		  "MPIi_ERR_ROOT_LARGE" => 1,
		  "MPIi_ERR_GROUP_NULL" => 1,
		  "MPIi_ERR_OP_NULL" => 1,
		  "MPIi_ERR_OP_UNDEFINED" => 1,
		  "MPIi_ERR_OP_FREE_PERM" => 1,
		  "MPIi_ERR_TOPOLOGY_SIZE" => 1,
		  "MPIi_ERR_TOPOLOGY_GRAPH_ARRAY_SIZE" => 1,
		  "MPIi_ERR_DIMS_ARRAY" => 1,
		  "MPIi_ERR_DIMS_MANY" => 1,
		  "MPIi_ERR_DIMS_TENSOR_SIZE" => 1,
		  "MPIi_ERR_DIMS_PARTITION" => 1,
		  "MPIi_ERR_ARG_ERRCODE" => 1,
		  "MPIi_ERR_ARG_NULL" => 1,
		  "MPIi_ERR_ARG_F77_ADDRESS" => 1,
		  "MPIi_ERR_ARG_ERRHANDLER" => 1,
		  "MPIi_ERR_ARG_ERRHANDLER_NULL" => 1,
		  "MPIi_ERR_ARG_ERRHANDLER_FREE_PERM" => 1,
		  "MPIi_ERR_ARG_STATUS_IGNORE" => 1,
		  "MPIi_ERR_ARG_STRIDE" => 1,
		  "MPIi_ERR_ARG_STRIDE_ZERO" => 1,
		  "MPIi_ERR_ARG_ARRAY_VAL" => 1,
		  "MPIi_ERR_ARG_NAMED" => 1,
		  "MPIi_ERR_ARG_NEGATIVE" => 1,
		  "MPIi_ERR_ARG_ARRAY_VAL_NEG" => 1,
		  "MPIi_ERR_ARG_DARRAY_DIST_NONE" => 1,
		  "MPIi_ERR_ARG_DARRAY_DIST_UNKNOWN" => 1,
		  "MPIi_ERR_ARG_DARRAY_INVALID_BLOCK" => 1,
		  "MPIi_ERR_ARG_DARRAY_INVALID_BLOCK2" => 1,
		  "MPIi_ERR_ARG_DARRAY_INVALID_CYCLIC" => 1,
		  "MPIi_ERR_ARG_POSITION_NEG" => 1,
		  "MPIi_ERR_ARG_INFO_NKEY" => 1,
		  "MPIi_ERR_OTHER_RESOURCE" => 1,
		  "MPIi_ERR_OTHER_RSEND" => 1,
		  "MPIi_ERR_OTHER_INIT_TWICE" => 1,
		  "MPIi_ERR_OTHER_INIT_BEFORE" => 1,
		  "MPIi_ERR_OTHER_STARTUP" => 1,
		  "MPIi_ERR_OTHER_NOMEM" => 1,
		  "MPIi_ERR_OTHER_ATTR_COPY" => 1,
		  "MPIi_ERR_INTERN" => 1,
		  "MPIi_ERR_REQUEST_NULL" => 1,
		  "MPIi_ERR_REQUEST_NOT_PERSISTENT" => 1,
		  "MPIi_ERR_AMODE_ONLY_ONE" => 1,
		  "MPIi_ERR_AMODE_RDONLY" => 1,
		  "MPIi_ERR_AMODE_SEQ" => 1,
		  "MPIi_ERR_BAD_FILE_LONG" => 1,
		  "MPIi_ERR_BAD_FILE_DIR" => 1,
		  "MPIi_ERR_FILE_NULL" => 1,
		  "MPIi_ERR_INFO_NULL" => 1,
		  "MPIi_ERR_INFO_KEY_NULL" => 1,
		  "MPIi_ERR_INFO_KEY_LENGTH" => 1,
		  "MPIi_ERR_INFO_KEY_EMPTY" => 1,
		  "MPIi_ERR_INFO_VALUE_NULL" => 1,
		  "MPIi_ERR_INFO_VALUE_LENGTH" => 1,
		  "MPIi_ERR_IO_ETYPE_FRACTIONAL" => 1,
		  "MPIi_ERR_IO_NO_FSTYPE" => 1,
		  "MPIi_ERR_IO_UNAVAILABLE_FSTYPE" => 1,
		  "MPIi_ERR_IO_MULTIPLE_SPLIT_COLL" => 1,
		  "MPIi_ERR_IO_NO_SPLIT_COLL" => 1,
		  "MPIi_ERR_IO_ASYNC_OUTSTANDING" => 1,
		  "MPIi_ERR_IO_NEED_RDWR" => 1,
		  "MPIi_ERR_IO_FILETYPE" => 1,
		  "MPIi_ERR_IO_NO_SHARED_FP" => 1,
		  "MPIi_ERR_IO_AMODE_SEQ" => 1,
		  "MPIi_ERR_IO_MORE_WRONLY" => 1,
		  "MPIi_ERR_IO_NO_MODE_SEQ" => 1,
		  "MPIi_ERR_NOT_SAME_VALUE" => 1,
		  "MPIi_ERR_NOT_SAME_ROOT" => 1,
		  "MPIi_ERR_NOT_SAME_COLLECTIVE_ORDER" => 1,
		  "MPIi_ERR_PORT_EXIST" => 1,
		  "MPIi_ERR_PORT_TIMEOUT" => 1,
		  "MPIi_ERR_SERVICE_UNPUBLISH" => 1,
		  "MPIi_ERR_SPAWN_FAILED" => 1,
		  "MPIi_ERR_SPAWN_NO_PGM" => 1,
		  "MPIi_ERR_SPAWN_PROCESS_MNGER" => 1,
		  "MPIi_ERR_WIN_NULL" => 1,
		  "MPIi_ERR_WIN_NAME" => 1,
		  "MPIi_ERR_WIN_INVALID_WINDOW" => 1,
		  "MPIi_ERR_KEYVAL_NULL" => 1,
		  "MPIi_ERR_KEYVAL_FREE_PERM" => 1,
		  "MPIi_ERR_KEYVAL_NOT_IN_COMM" => 1,
		  "MPIi_ERR_KEYVAL_NOT_IN_TYPE" => 1,
		  "MPIi_ERR_KEYVAL_NOT_IN_WIN" => 1,
		  "MPIi_ERR_NOEXPOSURE" => 1,
		  "MPIi_ERR_WIN_NOACCESS" => 1,
		  "MPI_PROC_NULL" => 1 );
while (<>) {
    # Remove the \_ expansion
    s/\\discretionary \{-\}\{\}\{\}//g;
    s/{\\texttt{\\char *`\\_ *}/_/g;
    s/{\\tt\s*\\char\s`\\_\s*}/_/g;
    if (/\\indexentry{MPID_(.)([A-Za-z0-9_]*)(!?[A-Za-z0-9_]*)}{(.*)}/) {
        $firstchar = $1;
        $name = $2;
        $subitem=$3;
	$rest = $4;
        $key="MPID_$firstchar$name";
	if (!defined($specialnames{$key})) {
  	    $name =~ tr/A-Z/a-z/;				     
        }
        print "\\indexentry{$firstchar${name}_MPID$subitem}{$rest}\n";
        }
    elsif (/\\indexentry{MPIi_(.)([A-Za-z0-9_]*)(!?[A-Za-z0-9_]*)}{(.*)}/) {
        $firstchar = $1;
        $name = $2;
        $subitem=$3;
	$rest = $4;
        $key="MPIi_$firstchar$name";
	if (!defined($specialnames{$key})) {
  	    $name =~ tr/A-Z/a-z/;				     
        }
        print "\\indexentry{$firstchar${name}_MPIi$subitem}{$rest}\n";
        }
    elsif (/\\indexentry{MPI_(ERR_[A-Za-z0-9_]*)(!?[A-Za-z0-9_]*)}{(.*)}/) {
        $name = $1;
        $subitem = $2;
	$rest = $3;
        print "\\indexentry{${name}_MPI$subitem}{$rest}\n";
	}
    elsif (/\\indexentry{MPI_(COMBINER_[A-Za-z0-9_]*)}{(.*)}/) {
        $name = $1;
	$rest = $2;
        print "\\indexentry{${name}_MPI}{$rest}\n";
	}
    elsif (/\\indexentry{(P?)MPI_(.)([A-Za-z0-9_\(\)]*)(!?[A-Za-z0-9_]*)}{(.*)}/) {
        $leadchar  = $1;
        $firstchar = $2;
        $name      = $3;
        $subitem   = $4;
	$rest      = $5;
        $key="MPI_$firstchar$name";
	if (!defined($specialnames{$key})) {
	    $name =~ tr/A-Z/a-z/;
        }
        print "\\indexentry{$firstchar${name}_${leadchar}MPI$subitem}{$rest}\n";
        }
    else {
	print $_;
    }
}
