// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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.
//
// @@@ END COPYRIGHT @@@

#include "mpi.h"

#include <stdlib.h>
#include <string.h>
#include "SCMVersHelp.h"

// component version for libraries
#define VERS_CV_MAJ 1
#define VERS_CV_MIN 0
#define VERS_CV_UPD 1

VERS_LIB(mpi_libmtmpi)

static int initialized = 0;
static int finalized = 0;

int
MPI_Init(int *argc, char ***argv)
{
	if (initialized) return MPI_ERR_INTERN;
	initialized = 1;
	finalized = 0;
	return MPI_SUCCESS;
}

int MPI_Abort(MPI_Comm comm, int errorcode)
{
	return MPI_ERR_INTERN;
}

int MPI_Allgather(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
                  void *recvbuf, int recvcount, MPI_Datatype recvtype,
                  MPI_Comm comm)
{
	return MPI_ERR_INTERN;
}

int
MPI_Barrier(MPI_Comm comm)
{
	return MPI_ERR_INTERN;
}

int MPI_Bcast( void *buffer, int count, MPI_Datatype datatype, int root,
               MPI_Comm comm )
{
	return MPI_ERR_INTERN;
}

int
MPI_Cancel(MPI_Request *request)
{
	return MPI_ERR_INTERN;
}

int
MPI_Close_port(const char *port_name)
{
	return MPI_ERR_INTERN;
}

int
MPI_Comm_accept(const char *port_name, MPI_Info info, int root, MPI_Comm comm, MPI_Comm *newcomm)
{
	return MPI_ERR_INTERN;
}

int
MPI_Comm_connect(const char *port_name, MPI_Info info, int root, MPI_Comm comm, MPI_Comm *newcomm)

{
	return MPI_ERR_INTERN;
}

int
MPI_Comm_disconnect(MPI_Comm *comm)
{
	return MPI_ERR_INTERN;
}

int
MPI_Comm_dup(MPI_Comm comm, MPI_Comm *ncomm)
{
	return MPI_ERR_INTERN;
}

int
MPI_Comm_free(MPI_Comm *comm)
{
	return MPI_ERR_INTERN;
}

int
MPI_Comm_get_errhandler(MPI_Comm comm, MPI_Errhandler *errhandler)
{
	return MPI_ERR_INTERN;
}

int
MPI_Comm_get_parent(MPI_Comm *comm)
{
	return MPI_ERR_INTERN;
}

int MPI_Comm_group(MPI_Comm comm, MPI_Group *group)
{
	return MPI_ERR_INTERN;
}

int
MPI_Comm_rank(MPI_Comm comm, int *rank)
{
	return MPI_ERR_INTERN;
}

int
MPI_Comm_remote_size(MPI_Comm comm, int *size)
{
	return MPI_ERR_INTERN;
}

int
MPI_Comm_size(MPI_Comm comm, int *size)
{
	return MPI_ERR_INTERN;
}

int
MPI_Comm_spawn_multiple(int count, char *array_of_commands[],
                        char* *array_of_argv[], const int array_of_maxprocs[],
                        const MPI_Info array_of_info[], int root, MPI_Comm comm,
                        MPI_Comm *intercomm, int array_of_errcodes[])
{
	return MPI_ERR_INTERN;
}

int
MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm)
{
	return MPI_ERR_INTERN;
}

int
MPI_Comm_set_errhandler(MPI_Comm comm, MPI_Errhandler errhandler)
{
	return MPI_SUCCESS;
}

int
MPI_Comm_test_inter(MPI_Comm comm, int *flag)
{
	return MPI_ERR_INTERN;
}

int
MPI_Errhandler_create(MPI_Handler_function *function,
                      MPI_Errhandler * errhandler)
{
	return MPI_ERR_INTERN;
}

int MPI_Errhandler_free(MPI_Errhandler *errhandler)
{
	return MPI_ERR_INTERN;
}

int
MPI_Error_class(int errcode, int *errclass)
{
	return MPI_ERR_INTERN;
}

int
MPI_Error_string(int errcode, char *string, int *resultlen)
{
	return MPI_ERR_INTERN;
}

int
MPI_Finalize(void)
{
	if (!initialized) return MPI_ERR_INTERN;
	initialized = 0;
	finalized = 1;
	return MPI_SUCCESS;
}

int
MPI_Finalized(int *flag)
{
	*flag = finalized;
	return MPI_SUCCESS;
}

int
MPI_Get_count(const MPI_Status *status, MPI_Datatype dtype, int *count)
{
	return MPI_ERR_INTERN;
}

int
MPI_Get_processor_name(char *name, int *resultlen)
{
	return MPI_ERR_INTERN;
}

int MPI_Group_free(MPI_Group *group)
{
	return MPI_ERR_INTERN;
}

int MPI_Group_size(MPI_Group group, int *size)
{
	return MPI_ERR_INTERN;
}

int
MPI_Info_create(MPI_Info *info)
{
	return MPI_ERR_INTERN;
}

int
MPI_Info_free(MPI_Info *info)
{
	return MPI_ERR_INTERN;
}

int
MPI_Info_set(MPI_Info info, const char *key, const char *val)
{
	return MPI_ERR_INTERN;
}

int
MPI_Initialized(int *flag)
{
	*flag = initialized;
	return MPI_SUCCESS;
}

int
MPI_Init_thread(int *argc, char ***argv, int required, int *provided)
{
	if (initialized) return MPI_ERR_INTERN;
	initialized = 1;
	finalized = 0;
	return MPI_SUCCESS;
}

int
MPI_Intercomm_create(MPI_Comm local_comm, int local_leader, MPI_Comm peer_comm,
                     int remote_leader, int tag, MPI_Comm *newintercomm)
{
	return MPI_ERR_INTERN;
}

int
MPI_Iprobe(int source, int tag, MPI_Comm comm, int *flag, MPI_Status *status)
{
	return MPI_ERR_INTERN;
}

int
MPI_Irecv(void *buff, int count, MPI_Datatype dtype, int source, int tag,
          MPI_Comm comm, MPI_Request *req)
{
	return MPI_ERR_INTERN;
}

int
MPI_Isend(const void *buff, int count, MPI_Datatype dtype, int dest, int tag,
          MPI_Comm comm, MPI_Request *req)
{
	return MPI_ERR_INTERN;
}

int
MPI_Lookup_name(const char *service_name, MPI_Info info, char *port_name)
{
	return MPI_ERR_INTERN;
}

int
MPI_Open_port(MPI_Info info, char *port_name)
{
	*port_name = 0;
	return MPI_SUCCESS;
}

int
MPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int *size)
{
	return MPI_ERR_INTERN;
}

int
MPI_Publish_name(const char *service_name, MPI_Info info, const char *port_name)
{
	return MPI_ERR_INTERN;
}

int
MPI_Recv(void *buff, int count, MPI_Datatype dtype, int source, int tag,
         MPI_Comm comm, MPI_Status *status)
{
	return MPI_ERR_INTERN;
}

int
MPI_Request_free(MPI_Request *req)
{
	return MPI_ERR_INTERN;
}

int
MPI_Send(const void *buff, int count, MPI_Datatype dtype, int dest, int tag,
         MPI_Comm comm)
{
	return MPI_ERR_INTERN;
}

int
MPI_Sendrecv(const void *sbuff, int scount, MPI_Datatype sdtype, int src,
             int stag,
             void *rbuff, int rcount, MPI_Datatype rdtype, int dst, int rtag,
             MPI_Comm comm, MPI_Status *status)
{
	return MPI_ERR_INTERN;
}

int
MPI_Test(MPI_Request *req, int *flag, MPI_Status *status)
{
	return MPI_ERR_INTERN;
}

int
MPI_Testany(int count, MPI_Request array_of_requests[], int *index,
               int *flag, MPI_Status *status)
{
	return MPI_ERR_INTERN;
}

int
MPI_Testsome(int incount, MPI_Request *reqs, int *outcount, int *ind,
             MPI_Status *stats)
{
	return MPI_ERR_INTERN;
}

int
MPI_Wait(MPI_Request *req, MPI_Status *status)
{
	return MPI_ERR_INTERN;
}

int
MPI_Waitall(int nreqs, MPI_Request *reqs, MPI_Status *stats)
{
	return MPI_ERR_INTERN;
}

int
MPI_Waitany(int nreqs, MPI_Request *reqs, int *ind, MPI_Status *stats)
{
	return MPI_ERR_INTERN;
}

int
MPI_Waitsome(int nreqs, MPI_Request *reqs, int *outcount, int *ind,
             MPI_Status *stats)
{
	return MPI_ERR_INTERN;
}

double
MPI_Wtick(void)
{
	return MPI_ERR_INTERN;
}

double
MPI_Wtime(void)
{
	return MPI_ERR_INTERN;
}
