#!/bin/sh

trap "rm -f /tmp/$$ /tmp/$$a" 0 1 2 3 15
entab </dev/null >/dev/null
if [ "$?" -ne 0 ]
then	echo "Go to the src/tools/entab directory and do a 'make' and 'make install'." >&2
	echo "This will put the 'entab' command in your path." >&2
	echo "Then run $0 again."
	exit 1
fi
indent -st -npro </dev/null >/dev/null 2>&1
if [ "$?" -ne 0 ]
then	echo "You do not appear to have 'indent' installed on your system." >&2
	exit 1
fi
indent -version -npro </dev/null >/dev/null 2>&1
if [ "$?" -eq 0 ]
then	echo "You appear to have GNU indent rather than BSD indent." >&2
	echo "See the pgindent/README file for a description of its problems." >&2
	EXTRA_OPTS="-ncdb -bli0 -npcs -cli4"
else	echo "Hope you installed /src/tools/pgindent/indent.bsd.patch." >&2
	EXTRA_OPTS="-bbb -cli1"
fi

for FILE
do
	cat $FILE |
	sed 's;/\*  *---;/*---X_X;g' |
# workaround for indent bug with 'else' handling
	sed 's;\([} 	]\)else[ 	]*\(/\*.*\)$;\1else\
\2;g' | 
	detab -t4 -qc |
# protect backslashes in DATA()
	sed 's;^DATA(.*$;/*&*/;' >/tmp/$$a

# We get the list of typedef's from /src/tools/find_typedef
	indent -bad -bap -bc -bl -d0 -cdb -nce -nfc1 -di12 -i4 -l75 \
		-lp -nip -npro $EXTRA_OPTS \
-TACL \
-TA_Const \
-TA_Expr \
-TA_Indices \
-TAbsoluteTime \
-TAcl \
-TAclId \
-TAclIdType \
-TAclItem \
-TAclMode \
-TAddAttrStmt \
-TAgg \
-TAggFuncInfo \
-TAggInfo \
-TAggState \
-TAggreg \
-TAllocElem \
-TAllocElemData \
-TAllocMode \
-TAllocPointer \
-TAllocSet \
-TAllocSetData \
-TAlterUserStmt \
-TAnyInvalidation \
-TAppend \
-TAppendState \
-TArray \
-TArrayRef \
-TArrayType \
-TAttr \
-TAttrDefault \
-TAttrNumber \
-TAttributeSize \
-TAttributeTupleForm \
-TAuthRequest \
-TAuthRequestPacket \
-TBOX \
-TBTItem \
-TBTItemData \
-TBTMetaPageData \
-TBTPageOpaque \
-TBTPageOpaqueData \
-TBTPageState \
-TBTPriQueue \
-TBTPriQueueElem \
-TBTScanList \
-TBTScanListData \
-TBTScanOpaque \
-TBTScanOpaqueData \
-TBTSortKey \
-TBTSpool \
-TBTStack \
-TBTStackData \
-TBTTapeBlock \
-TBUCKET_INDEX \
-TBackend \
-TBackendId \
-TBackendTag \
-TBindingEnt \
-TBitArray \
-TBitIndex \
-TBlock \
-TBlockId \
-TBlockIdData \
-TBlockNumber \
-TBoolPtr \
-TBucket \
-TBufFlags \
-TBuffer \
-TBufferBlock \
-TBufferDesc \
-TBufferHdr \
-TBufferLock \
-TBufferTag \
-TCHUNK_INFO \
-TCIRCLE \
-TCInfo \
-TCPFunction \
-TCPPFunction \
-TCandidateList \
-TCash \
-TCatCTup \
-TCatCache \
-TCatalogInvalidationData \
-TChangeACLStmt \
-TChar16 \
-TChoose \
-TChromosome \
-TCity \
-TClosePortalStmt \
-TClusterStmt \
-TCmdType \
-TColumnDef \
-TCommandDest \
-TCommandId \
-TCommonScanState \
-TCommonState \
-TConnStatusType \
-TConst \
-TConstrCheck \
-TConstrType \
-TConstraint \
-TCopyStmt \
-TCost \
-TCreatePLangStmt \
-TCreateSeqStmt \
-TCreateStmt \
-TCreateTrigStmt \
-TCreateUserStmt \
-TCreatedbStmt \
-TDateADT \
-TDateTime \
-TDatum \
-TDatumPtr \
-TDefElem \
-TDefineStmt \
-TDeleteStmt \
-TDestroyStmt \
-TDestroydbStmt \
-TDlelem \
-TDllist \
-TDropPLangStmt \
-TDropTrigStmt \
-TDropUserStmt \
-TDynamicFileList \
-TELEMENT \
-TEState \
-TEdge \
-TErrorMessagePacket \
-TExcContext \
-TExcData \
-TExcDetail \
-TExcFrame \
-TExcId \
-TExcMessage \
-TExcProc \
-TException \
-TExecStatus \
-TExecStatusType \
-TExitStatus \
-TExplainState \
-TExplainStmt \
-TExpr \
-TExprContext \
-TExtendStmt \
-TFILE \
-TFUNMAP \
-TFetchStmt \
-TFile \
-TFileName \
-TFixedItem \
-TFixedItemData \
-TFixedStack \
-TFixedStackData \
-TFjoin \
-TFmgrCall \
-TFmgrInfo \
-TFmgrValues \
-TFormData_pg_aggregate \
-TFormData_pg_am \
-TFormData_pg_amop \
-TFormData_pg_amproc \
-TFormData_pg_attrdef \
-TFormData_pg_attribute \
-TFormData_pg_class \
-TFormData_pg_database \
-TFormData_pg_group \
-TFormData_pg_index \
-TFormData_pg_inherits \
-TFormData_pg_ipl \
-TFormData_pg_language \
-TFormData_pg_listener \
-TFormData_pg_log \
-TFormData_pg_opclass \
-TFormData_pg_operator \
-TFormData_pg_proc \
-TFormData_pg_relcheck \
-TFormData_pg_rewrite \
-TFormData_pg_sequence \
-TFormData_pg_statistic \
-TFormData_pg_trigger \
-TFormData_pg_user \
-TFormData_pg_variable \
-TFormData_pg_version \
-TForm_pg_aggregate \
-TForm_pg_am \
-TForm_pg_amop \
-TForm_pg_amproc \
-TForm_pg_attrdef \
-TForm_pg_class \
-TForm_pg_database \
-TForm_pg_group \
-TForm_pg_ipl \
-TForm_pg_language \
-TForm_pg_log \
-TForm_pg_opclass \
-TForm_pg_proc \
-TForm_pg_relcheck \
-TForm_pg_rewrite \
-TForm_pg_statistic \
-TForm_pg_trigger \
-TForm_pg_user \
-TForm_pg_variable \
-TFunc \
-TFuncCall \
-TFuncIndexInfo \
-TFuncIndexInfoPtr \
-TFuncInfo \
-TFunction \
-TFunctionCache \
-TFunctionCachePtr \
-TGISTENTRY \
-TGISTPageOpaque \
-TGISTPageOpaqueData \
-TGISTSTACK \
-TGISTSTATE \
-TGISTScanList \
-TGISTScanListData \
-TGISTScanOpaque \
-TGISTScanOpaqueData \
-TGIST_SPLITVEC \
-TGene \
-TGlobalMemory \
-TGroup \
-TGroupBuffer \
-TGroupClause \
-TGroupState \
-THASHACTION \
-THASHCTL \
-THHDR \
-THISTORY_STATE \
-THIST_ENTRY \
-THInfo \
-THTAB \
-THash \
-THashBucket \
-THashBucketData \
-THashItem \
-THashItemData \
-THashJoin \
-THashJoinState \
-THashJoinTable \
-THashMetaPage \
-THashMetaPageData \
-THashPageOpaque \
-THashPageOpaqueData \
-THashPath \
-THashScanList \
-THashScanListData \
-THashScanOpaque \
-THashScanOpaqueData \
-THashState \
-THashTableData \
-THashtFunc \
-THeapAccessStatistics \
-THeapAccessStatisticsData \
-THeapMemoryBlock \
-THeapMemoryBlockData \
-THeapScanDesc \
-THeapScanDescData \
-THeapTuple \
-THeapTupleData \
-TINTRANGE \
-TIPCKey \
-TIdList \
-TIdent \
-TIdxInfoRetval \
-TIndDesc \
-TIndInfo \
-TIndex \
-TIndexAttributeBitMap \
-TIndexAttributeBitMapData \
-TIndexElem \
-TIndexInfo \
-TIndexList \
-TIndexPath \
-TIndexScan \
-TIndexScanDesc \
-TIndexScanDescData \
-TIndexScanDescPtr \
-TIndexScanState \
-TIndexStmt \
-TIndexStrategy \
-TIndexStrategyData \
-TIndexTuple \
-TIndexTupleData \
-TIndexTupleForm \
-TInhInfo \
-TInhPaths \
-TInheritsTupleForm \
-TInsertIndexResult \
-TInsertIndexResultData \
-TInsertStmt \
-TIntArray \
-TInt_yy_size_t \
-TInt_yy_state_type \
-TInvalidationEntry \
-TInvalidationEntryData \
-TInvalidationMessage \
-TInvalidationMessageData \
-TInvalidationUserData \
-TIpcMemoryId \
-TIpcMemoryKey \
-TIpcSemaphoreId \
-TIpcSemaphoreKey \
-TItem \
-TItemId \
-TItemIdData \
-TItemIdFlags \
-TItemLength \
-TItemOffset \
-TItemPointer \
-TItemPointerData \
-TIter \
-TJInfo \
-TJoin \
-TJoinKey \
-TJoinMethod \
-TJoinPath \
-TJoinState \
-TJunkFilter \
-TKEYMAP_ENTRY \
-TKEYMAP_ENTRY_ARRAY \
-TKeymap \
-TLINE \
-TLOCK \
-TLOCKCTL \
-TLOCKT \
-TLOCKTAB \
-TLOCKTAG \
-TLOCK_TYPE \
-TLRelId \
-TLSEG \
-TLargeObjectDesc \
-TLeftistContext \
-TLeftistContextData \
-TLibCCopyLength \
-TList \
-TListenStmt \
-TLoadStmt \
-TLocalInvalid \
-TLocationIndex \
-TLockInfo \
-TLockInfoData \
-TLockTableId \
-TLogRelationContents \
-TLogRelationContentsData \
-TLookupEnt \
-TMASK \
-TMInfo \
-TMarkData \
-TMaterial \
-TMaterialState \
-TMdfdVec \
-TMemoryContext \
-TMemoryContextMethods \
-TMergeJoin \
-TMergeJoinState \
-TMergeOrder \
-TMergePath \
-TMsgType \
-TName \
-TNameData \
-TNestLoop \
-TNestLoopState \
-TNode \
-TNodeTag \
-TNotifyStmt \
-TOffset \
-TOffsetNumber \
-TOid \
-TOidInt2 \
-TOidInt2Data \
-TOidInt4 \
-TOidInt4Data \
-TOidName \
-TOidNameData \
-TOpType \
-TOpaque \
-TOpaqueData \
-TOper \
-TOperator \
-TOperatorTupleForm \
-TOprInfo \
-TOrderKey \
-TOrderType \
-TOrderedElem \
-TOrderedElemData \
-TOrderedSet \
-TOrderedSetData \
-TOverflowPageAddress \
-TOverflowTuple \
-TOverflowTupleData \
-TPATH \
-TPG_LOCK_LEVEL \
-TPGconn \
-TPGlobjfuncs \
-TPGnotify \
-TPGresAttDesc \
-TPGresAttValue \
-TPGresult \
-TPOLYGON \
-TPQArgBlock \
-TPQNotifyList \
-TPQconninfoOption \
-TPQprintOpt \
-TPROC \
-TPROC_HDR \
-TPROC_QUEUE \
-TPacket \
-TPacketLen \
-TPacketState \
-TPage \
-TPageHeader \
-TPageHeaderData \
-TPageManagerMode \
-TPageOffset \
-TParam \
-TParamExecData \
-TParamListInfo \
-TParamListInfoData \
-TParamNo \
-TParamString \
-TParseState \
-TPasswordPacket \
-TPasswordPacketV0 \
-TPath \
-TPathOrder \
-TPlan \
-TPoint \
-TPointer \
-TPool \
-TPort \
-TPortal \
-TPortalBlock \
-TPortalBlockData \
-TPortalBuffer \
-TPortalD \
-TPortalEntry \
-TPortalHashEnt \
-TPortalHeapMemory \
-TPortalMemoryContext \
-TPortalVariableMemory \
-TPredInfo \
-TPrivateMem \
-TProcState \
-TProcedureStmt \
-TProcessingMode \
-TProjectionInfo \
-TProtocolVersion \
-TPsortstate \
-TPsqlSettings \
-TQuery \
-TQueryDesc \
-TQueryTreeList \
-TREAD_ROUTINE \
-TRTSTACK \
-TRTSTATE \
-TRTScanList \
-TRTScanListData \
-TRTreePageOpaque \
-TRTreePageOpaqueData \
-TRTreeScanOpaque \
-TRTreeScanOpaqueData \
-TRangeTblEntry \
-TRangeVar \
-TRecipeStmt \
-TRegProcedure \
-TRel \
-TRelExpr \
-TRelIdCacheEnt \
-TRelNameCacheEnt \
-TRelation \
-TRelationBuildDescInfo \
-TRelationData \
-TRelationInfo \
-TRelationInvalidationData \
-TRelationList \
-TRelationPtr \
-TRelativeAddr \
-TRelativeTime \
-TRelid \
-TRemoveAggrStmt \
-TRemoveFuncStmt \
-TRemoveOperStmt \
-TRemoveStmt \
-TRenameStmt \
-TResTarget \
-TResdom \
-TResult \
-TResultState \
-TRetrieveIndexResult \
-TRetrieveIndexResultData \
-TRewriteInfo \
-TRewriteRule \
-TRuleLock \
-TRuleStmt \
-TSEGMENT \
-TSEG_OFFSET \
-TSEMA \
-TSHMEM_OFFSET \
-TSHM_QUEUE \
-TSISeg \
-TSISegEntry \
-TSISegOffsets \
-TSLock \
-TSPINLOCK \
-TSPITupleTable \
-TSPLITVEC \
-TScan \
-TScanDirection \
-TScanFunc \
-TScanKey \
-TScanKeyData \
-TScanKeyword \
-TSelectStmt \
-TSeqScan \
-TSeqTable \
-TSeqTableData \
-TSequenceTupleForm \
-TSharedInvalid \
-TSharedInvalidData \
-TSize \
-TSockAddr \
-TSort \
-TSortClause \
-TSortGroupBy \
-TSortState \
-TSplitNumber \
-TStartupPacket \
-TStrategyEvaluation \
-TStrategyEvaluationData \
-TStrategyExpression \
-TStrategyExpressionData \
-TStrategyMap \
-TStrategyMapData \
-TStrategyNumber \
-TStrategyOperator \
-TStrategyOperatorData \
-TStrategyTerm \
-TStrategyTermData \
-TStrategyTransformMap \
-TStrategyTransformMapData \
-TStream \
-TStreamPtr \
-TStringInfo \
-TStringInfoData \
-TSubLink \
-TSubLinkType \
-TSubPlan \
-TSuperQE \
-TSystemPortAddress \
-TTUPLE \
-TTXTRANGE \
-TTableID \
-TTableInfo \
-TTargetEntry \
-TTee \
-TTeeState \
-TTemp \
-TTempRelList \
-TTimeADT \
-TTimeInterval \
-TTimeIntervalData \
-TTimeSpan \
-TTransactionId \
-TTransactionState \
-TTransactionStateData \
-TTransactionStmt \
-TTrigger \
-TTriggerData \
-TTriggerDesc \
-TTriggerEvent \
-TTupleBlock \
-TTupleConstr \
-TTupleDesc \
-TTupleTable \
-TTupleTableData \
-TTupleTableSlot \
-TType \
-TTypeBlock \
-TTypeInfo \
-TTypeName \
-TTypeTupleForm \
-TTypeTupleFormData \
-TUNDO_LIST \
-TUnique \
-TUniqueState \
-TUpdateStmt \
-TUserAuth \
-TVAttList \
-TVAttListData \
-TVFunction \
-TVPageDescr \
-TVPageDescrData \
-TVPageList \
-TVPageListData \
-TVRelList \
-TVRelListData \
-TVRelStats \
-TVacAttrStats \
-TVacuumStmt \
-TValue \
-TVar \
-TVariableRelationContents \
-TVariableRelationContentsData \
-TVariableResetStmt \
-TVariableSetStmt \
-TVariableShowStmt \
-TVersionStmt \
-TVersionTupleForm \
-TVfd \
-TViewStmt \
-TXIDLookupEnt \
-TXIDTAG \
-TXidStatus \
-TYYSTYPE \
-TYY_BUFFER_STATE \
-TYY_CHAR \
-T_LockId_ \
-T_RuneEntry \
-T_RuneLocale \
-T_RuneRange \
-T_SPI_connection \
-T_SPI_plan \
-Taclitem \
-Tbits16 \
-Tbits32 \
-Tbits8 \
-Tbool \
-Tbool16 \
-Tbool32 \
-Tbool8 \
-Tbytea \
-Tcaddr_t \
-Tcat_t \
-Tcc_t \
-Tchar \
-TcharPP \
-Tclock_t \
-Tclockid_t \
-Tcset \
-Tdaddr_t \
-Tdatetkn \
-Tdev_t \
-Tdhalloc_ptr \
-Tdiv_t \
-Tdouble \
-Texecution_state \
-Tf_smgr \
-Tfd_mask \
-Tfd_set \
-Tfixpt_t \
-Tfloat \
-Tfloat32 \
-Tfloat32data \
-Tfloat4 \
-Tfloat64 \
-Tfloat64data \
-Tfloat8 \
-Tfpos_t \
-Tfunc_ptr \
-Tgid_t \
-Thashnode \
-Tino_t \
-Tint \
-Tint16 \
-Tint16_t \
-Tint16m_t \
-Tint2 \
-Tint28 \
-Tint32 \
-Tint32_t \
-Tint32m_t \
-Tint4 \
-Tint64_t \
-Tint64m_t \
-Tint8 \
-Tint8_t \
-Tint8m_t \
-TintP \
-Tjmp_buf \
-Tkey_t \
-Tldiv_t \
-Tmode_t \
-Tnlink_t \
-Toff_t \
-Toid8 \
-Tpg_pwd \
-Tpid_t \
-Tpqbool \
-Tpqsigfunc \
-Tptrdiff_t \
-Tqaddr_t \
-Tquad_t \
-Tregex_t \
-Tregister_t \
-Tregmatch_t \
-Tregoff_t \
-Tregproc \
-Trune_t \
-Tsegsz_t \
-Tsequence_magic \
-Tsig_atomic_t \
-Tsig_func \
-Tsig_t \
-Tsigjmp_buf \
-Tsigset_t \
-Tsize_t \
-Tslock_t \
-Tsmgrid \
-Tsop \
-Tsopno \
-Tspeed_t \
-Tssize_t \
-Tswblk_t \
-Ttcflag_t \
-Ttcp_seq \
-Ttext \
-Ttime_t \
-Tu_char \
-Tu_int \
-Tu_int16_t \
-Tu_int16m_t \
-Tu_int32_t \
-Tu_int32m_t \
-Tu_int64_t \
-Tu_int64m_t \
-Tu_int8_t \
-Tu_int8m_t \
-Tu_long \
-Tu_quad_t \
-Tu_short \
-Tuch \
-Tuid_t \
-Tuint \
-Tuint16 \
-Tuint32 \
-Tuint8 \
-Tushort \
-Tva_list \
-Tvm_offset_t \
-Tvm_size_t \
-Tvoid \
-Twchar_t \
-Tword16 \
-Tword32 \
-Tword8 \
-Tyy_size_t \
-Tyy_state_type \
-Tinet \
-Tmacaddr \
/tmp/$$a >/tmp/$$ 2>&1
	if [ "$?" -ne 0 -o -s /tmp/$$ ]
	then	echo "$FILE"
		cat /tmp/$$
	fi
	cat /tmp/$$a |
	sed 's;^/\*\(DATA(.*\)\*/$;\1;' |
	sed 's;/\*---X_X;/* ---;g' |
# workaround indent bug
	sed 's;^static[ 	][ 	]*;static ;g' |
	sed 's;^}[ 	][ 	]*/\*;}   /*;' |
	sed 's;^#endif[ 	][ 	]*/\*;#endif   /*;' |
	detab -t8 -qc |
	entab -t4 -qc |
# move trailing * in function return type
	sed 's;^\([A-Za-z_][^	]*\)[ 	][ 	]*\*$;\1 *;' |
# remove un-needed braces around single statements
	awk '
	{	
			line3 = $0;  
			if (skips > 0)
				skips--;
			if (line1 ~ "		*{$" &&
			    line2 ~ "		*[^;{}]*;$" &&
			    line3 ~ "		*}$")
			{
				print line2;
				line1 = "";
				line2 = "";
				line3 = "";
				skips = 3;
			}
			else
	 			if (skips == 0 && NR >= 3)
					print line1;
			line1 = line2;
			line2 = line3;
			line3 = "";
		}
		END {
			if (skips <= 1)
				print line1;
			if (skips <= 2)
				print line2;
	}' |
#  Move prototype names to the same line as return type.  Useful for ctags. 
#  Indent should do this, but it does not.  It formats prototypes just
#  like real functions.
	awk '	BEGIN	{paren_level = 0}  
	{
		if ($0 ~ /^[a-zA-Z_][a-zA-Z_0-9]*[^\(]*$/)
		{
			saved_len = 0;
			saved_lines[++saved_len] = $0;
			if ((getline saved_lines[++saved_len]) == 0)
				print saved_lines[1];
			else
			if (saved_lines[saved_len] !~ /^[a-zA-Z_][a-zA-Z_0-9]*\(/ ||
			    saved_lines[saved_len] ~  /^[a-zA-Z_][a-zA-Z_0-9]*\(.*\)$/ ||
			    saved_lines[saved_len] ~  /^[a-zA-Z_][a-zA-Z_0-9]*\(.*\);$/)
			{
				print saved_lines[1];
				print saved_lines[2];
			}
			else
			{
				while (1)
				{
					if ((getline saved_lines[++saved_len]) == 0)
						break;
					if (saved_lines[saved_len] ~ /^[^ 	]/ ||
					    saved_lines[saved_len] !~ /,$/)
						break;
				}
				for (i=1; i <= saved_len; i++)
				{
					if (i == 1 && saved_lines[saved_len] ~ /\);$/)
					{
						printf "%s", saved_lines[i];
						if (substr(saved_lines[i], length(saved_lines[i]),1) != "*")
							printf " ";
					}
					else	print saved_lines[i];
				}
			}
		}
		else	print $0;
	}' |
	cat >/tmp/$$ && cat /tmp/$$ >$FILE
done

# The 'for' loop makes these backup files useless so delete them
rm -f *a.BAK
