//	cwtest.c	gg630504 hg9ieg linux.ubuntu.gcc utf-8
//	2020-11-10 - 2020-12-26
// $ sudo apt-get update
// $ sudo apt-get install gcc
// $ sudo apt-get install make

#include <stdio.h>

#include "ggstd.h"

#include "ggch.h"
#include "ggcw.h"

#define szCwMark	"="	// távírójel
#define szCwSpace	"-"	// távírószünet

typedef struct	{
F		fFirst;		// első vagy első szünet karakterek
W		wSpace;		// előjegyzett szünet hossza elemi időben
}		CWTX;		// adás státusz

typedef CWTX *	PCWTX;

CWTX		cwtx = { fTrue };	// adás státusz

//---------------------------------------------------------------------
// távírójelet/távírószünetet ad
R		RCwTxFW( F, W );
R		RCwTxFW( f_, w_ )
F		f_;	// jel/szünet
W		w_;	// jel/szünet hossza elemi időben

{
IX		ix;
R		r;

r = rSucceed;
for( ix = 0; ix<w_; ix++ )
	if( fputs( f_ ? szCwMark : szCwSpace, stdout )<0 )
		{ r = rWrite; goto ret; }
ret:
return( r );
}

//---------------------------------------------------------------------
// egy távíró karaktert ad
R		RCwTxCuPcwtx( CU, PCWTX );
R		RCwTxCuPcwtx( cu_, pcwtx_ )
CU		cu_;		// adandó unicode karakter
PCWTX		pcwtx_;		// adás státusz

{
R		r;
CWC		cwc;

r = rSucceed;
if( (cwc=CwcFromCu( cu_ ))!=0 )	// távírókód unicode-ból
	{
	if( cwc==cwcSpace )	// szóköz
		{
		if( !pcwtx_->fFirst )
			pcwtx_->wSpace = 7;	// előjegyzett távírószünet
		}
	else	{
		pcwtx_->fFirst = fFalse;
		// előjegyzett szünet
		if( (r=RCwTxFW( fFalse, pcwtx_->wSpace ))!=rSucceed ) goto ret;

		while( !(cwc==cwcEnd) )
			{
			// hosszú (3) vagy rövid (1) távírójel
			if( (r=RCwTxFW( fTrue, cwc & cwcBit ? 3 : 1 ))!=rSucceed ) goto ret;
			// következő távírójel beléptetése
			ShiftCwc( cwc );
			if( cwc!=cwcEnd )
				{
				// karakteren belüli 1 szünet
				if( (r=RCwTxFW( fFalse, 1 ))!=rSucceed ) goto ret;
				}
			}

		pcwtx_->wSpace = 3;	// előjegyzett szünet
		}
	}
else	{ r = rNotFound; goto ret; }
ret:
return( r );
}

//---------------------------------------------------------------------
// távíró szöveget ad
R		RCwTxSzPcwtx( SZ, PCWTX );
R		RCwTxSzPcwtx( sz_, pcwtx_ )
SZ		sz_;		// adandó szöveg UTF-8
PCWTX		pcwtx_;		// adás státusz

{
CU		cu;
R		r;

r = rSucceed;

while( (cu=CuFromPsz( &sz_ ))!=cuEos && (r=RCwTxCuPcwtx( cu, pcwtx_ ))>=0 )
	;

return( r );
}

//---------------------------------------------------------------------
int		main( cv_, pszv_, psze_ )
int		cv_;	// be:		paraméterek száma
char**		pszv_;	// be:		paraméterek tömbje
char**		psze_;	// be:		környezet tömbje
			// vissza:	hibakód abszolút értéke
{
R		r;

r = rSucceed;

//-------
fprintf( stdout, szPrgr "/cwtest0/" __DATE__ " " __TIME__ "\n>" );


if( (r=RCwTxSzPcwtx( "Hello world!", &cwtx ))!=rSucceed ) goto ret;


if( fputs( "<\n", stdout )<0 )
	{ r = rWrite; goto ret; }

//-------
ret:
fprintf( stdout, "Hibakód: %d\n", r );
return( r<0 ?  -r : r );
}

