	/*********************************************************/
 	/*                                                       */
	/*                                                       */
 	/*         Copyright (C), 1993  SEIKOEPSON Corp.         */
 	/*         ALL RIGHTS RESERVED                           */
 	/*                                                       */
	/*                                                       */
 	/*  file name : stdarg.h                                 */
 	/*                                                       */
	/*  Revision history                                     */
	/*      93/11/30    first release       K.Shinozuka      */
	/*      11/11/22    modify for P/ECE    Naoyuki Sawa     */
	/*      15/01/16    modify for P/ECE    Naoyuki Sawa     */
	/*                  va_copy()を追加しました。va_copy()はC99で追加されたマクロです。 */
	/*      15/11/18    modify for P/ECE    Naoyuki Sawa     */
	/*                  'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。 */
	/*                                                       */
	/*    stdarg.h contains followings.                      */
	/*        a declaration of a type                        */
	/*        three definitions of a macro                   */
	/*            for a variable number of arguments         */
	/*            of varying types                           */
	/*                                                       */
	/*********************************************************/

/* * Tue Nov 22 02:15:06 JST 2011 Naoyuki Sawa
 * - /usr/PIECE/include にあるファイルよりも、このファイルが優先されるよう、clip.mkにて、インクルードパスを設定してあります。
 * - smcvals.hがインクルードされていなければ、stdarg.hの中でsmcvals.hをインクルードするようにしました。
 *   EPSONライブラリのstdarg.hは、S1C33アーキテクチャ依存のヘッダファイルsmcvals.hの中で定義されている、_BOUNDARYに依存しているからです。
 * - これまではclipstd.hの中でsmcvals.hをインクルードしていましたが、今後はstdarg.hの中でsmcvals.hをインクルードすることにしました。
 *   このように変更した理由は、フリーウェアのコンパイル時など、clipstd.hを経由せずにstdarg.hを直接インクルードした場合にも、smcvals.hがインクルードされるようにしたいからです。
 * - clipstd.hの中のsmcvals.hのインクルードは、そのまま残してあります。
 *   clipstd.hの中でstdarg.hをインクルードしているので、smcvals.hも必ずインクルードされ、smcvals.hを明示的にインクルードすることは不要になったのですが、
 *   smcvals.hはstdarg.hのためだけでなくその他にも様々なS1C33アーキテクチャ依存の定義を含んでいるため、あえて明示的にインクルードするよう残しておくことにしました。
 */

#ifndef _STDARG_H
#define _STDARG_H

//{{2011/11/22:追加
#include <smcvals.h>	/* smcvals.h自身で多重インクルードのガードをしているので、インクルードする側では多重インクルードのガードは不要です。 */
//}}2011/11/22:追加

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

typedef char *va_list;

#define va_end( tdArgP )    (void) 0
#define _SIZEOF( type )  ((( sizeof( type ) + _BOUNDARY - 1 ) / _BOUNDARY ) * _BOUNDARY )


#ifdef  BIG_ENDIAN
#   define _ENDSIZE( type ) sizeof( type )
#else
#   define _ENDSIZE( type ) ((( sizeof( type ) + _BOUNDARY - 1 ) / _BOUNDARY ) * _BOUNDARY )
#endif


#if !defined(UNIX) || defined(ANSI)

#   define va_start( tdArgP, lastparm )   \
          (void)( tdArgP = (va_list)&(lastparm) + _SIZEOF( lastparm ))   /* initialization of tdArgP */
#   define va_arg( tdArgP, type )    \
          *((type *)( (tdArgP =  tdArgP + _SIZEOF( type )) - _ENDSIZE( type ) ))
                                                /* return next argument and make tdArgP move forward */

#else

#   define va_alist __builtin_va_alist
#   define va_dcl int va_alist;
#   define va_start( tdArgP ) tdArgP = (char *) &va_alist
#   define va_arg( tdArgP, type )    \
          *((type *)(( tdArgP = tdArgP + _SIZEOF( type ) ) - _ENDSIZE( type ) ))
                                                /* return next argument and make tdArgP move forward */

#endif   /* end UNIX & ANSI */

//{{2015/01/16追加:va_copy()を追加しました。va_copy()はC99で追加されたマクロです。
#define va_copy(tdArgP1,tdArgP2) do{(tdArgP1)=(tdArgP2);}while(0)
//}}2015/01/16追加:va_copy()を追加しました。va_copy()はC99で追加されたマクロです。

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif   /* end _STDARG_H */
