// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
/*
 ****************************************************************************
 *
 *                   "DHRYSTONE" Benchmark Program
 *                   -----------------------------
 *
 *  Version:    C, Version 2.1
 *
 *  File:       dhry_2.c (part 3 of 3)
 *
 *  Date:       May 25, 1988
 *
 *  Author:     Reinhold P. Weicker
 *
 ****************************************************************************
 */

#include "dhry.h"

#include <linux/string.h>


static Boolean Func_3(Enumeration Enum_Par_Val)
/***************************/
/* executed once        */
/* Enum_Par_Val == Ident_3 */
{
	Enumeration Enum_Loc;

	Enum_Loc = Enum_Par_Val;
	if (Enum_Loc == Ident_3) {
		/* then, executed */
		return true;
	} else {
		/* not executed */
		return false;
	}
} /* Func_3 */


void Proc_6(Enumeration  Enum_Val_Par, Enumeration *Enum_Ref_Par)
/*********************************/
/* executed once */
/* Enum_Val_Par == Ident_3, Enum_Ref_Par becomes Ident_2 */
{
	*Enum_Ref_Par = Enum_Val_Par;
	if (!Func_3(Enum_Val_Par)) {
		/* then, not executed */
		*Enum_Ref_Par = Ident_4;
	}
	switch (Enum_Val_Par) {
	case Ident_1:
		*Enum_Ref_Par = Ident_1;
		break;
	case Ident_2:
		if (Int_Glob > 100) {
			/* then */
			*Enum_Ref_Par = Ident_1;
		} else {
			*Enum_Ref_Par = Ident_4;
		}
		break;
	case Ident_3: /* executed */
		*Enum_Ref_Par = Ident_2;
		break;
	case Ident_4:
		break;
	case Ident_5:
		*Enum_Ref_Par = Ident_3;
		break;
	} /* switch */
} /* Proc_6 */


void Proc_7(One_Fifty Int_1_Par_Val, One_Fifty Int_2_Par_Val, One_Fifty *Int_Par_Ref)
/**********************************************/
/* executed three times                                      */
/* first call:      Int_1_Par_Val == 2, Int_2_Par_Val == 3,  */
/*                  Int_Par_Ref becomes 7                    */
/* second call:     Int_1_Par_Val == 10, Int_2_Par_Val == 5, */
/*                  Int_Par_Ref becomes 17                   */
/* third call:      Int_1_Par_Val == 6, Int_2_Par_Val == 10, */
/*                  Int_Par_Ref becomes 18                   */
{
	One_Fifty Int_Loc;

	Int_Loc = Int_1_Par_Val + 2;
	*Int_Par_Ref = Int_2_Par_Val + Int_Loc;
} /* Proc_7 */


void Proc_8(Arr_1_Dim Arr_1_Par_Ref, Arr_2_Dim Arr_2_Par_Ref, int Int_1_Par_Val, int Int_2_Par_Val)
/*********************************************************************/
/* executed once      */
/* Int_Par_Val_1 == 3 */
/* Int_Par_Val_2 == 7 */
{
	One_Fifty Int_Index;
	One_Fifty Int_Loc;

	Int_Loc = Int_1_Par_Val + 5;
	Arr_1_Par_Ref[Int_Loc] = Int_2_Par_Val;
	Arr_1_Par_Ref[Int_Loc+1] = Arr_1_Par_Ref[Int_Loc];
	Arr_1_Par_Ref[Int_Loc+30] = Int_Loc;
	for (Int_Index = Int_Loc; Int_Index <= Int_Loc+1; ++Int_Index)
		Arr_2_Par_Ref[Int_Loc][Int_Index] = Int_Loc;
	Arr_2_Par_Ref[Int_Loc][Int_Loc-1] += 1;
	Arr_2_Par_Ref[Int_Loc+20][Int_Loc] = Arr_1_Par_Ref[Int_Loc];
	Int_Glob = 5;
} /* Proc_8 */


Enumeration Func_1(Capital_Letter Ch_1_Par_Val, Capital_Letter Ch_2_Par_Val)
/*************************************************/
/* executed three times                                         */
/* first call:      Ch_1_Par_Val == 'H', Ch_2_Par_Val == 'R'    */
/* second call:     Ch_1_Par_Val == 'A', Ch_2_Par_Val == 'C'    */
/* third call:      Ch_1_Par_Val == 'B', Ch_2_Par_Val == 'C'    */
{
	Capital_Letter Ch_1_Loc;
	Capital_Letter Ch_2_Loc;

	Ch_1_Loc = Ch_1_Par_Val;
	Ch_2_Loc = Ch_1_Loc;
	if (Ch_2_Loc != Ch_2_Par_Val) {
		/* then, executed */
		return Ident_1;
	} else {
		/* not executed */
		Ch_1_Glob = Ch_1_Loc;
		return Ident_2;
	}
} /* Func_1 */


Boolean Func_2(Str_30 Str_1_Par_Ref, Str_30 Str_2_Par_Ref)
/*************************************************/
/* executed once */
/* Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" */
/* Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */
{
	One_Thirty Int_Loc;
	Capital_Letter Ch_Loc;

	Int_Loc = 2;
	while (Int_Loc <= 2) {
		/* loop body executed once */
		if (Func_1(Str_1_Par_Ref[Int_Loc],
			   Str_2_Par_Ref[Int_Loc+1]) == Ident_1) {
			/* then, executed */
			Ch_Loc = 'A';
			Int_Loc += 1;
		}
	} /* if, while */
	if (Ch_Loc >= 'W' && Ch_Loc < 'Z') {
		/* then, not executed */
		Int_Loc = 7;
	}
	if (Ch_Loc == 'R') {
		/* then, not executed */
		return true;
	} else {
		/* executed */
		if (strcmp(Str_1_Par_Ref, Str_2_Par_Ref) > 0) {
			/* then, not executed */
			Int_Loc += 7;
			Int_Glob = Int_Loc;
			return true;
		} else {
			/* executed */
			return false;
		}
	} /* if Ch_Loc */
} /* Func_2 */
