On Mon, 2006-11-06 at 09:18 -0600, Jim Smith wrote:
> I know the developers are hard at doing ham radio right now, but maybe
> one of the users can answer my question.
> 
> How in the heck do you get Tlf to write the Cabrillo file properly for
> ARRL Sweepstakes?  When I enter ':write', I have put in my exchange
> any
> number of different ways, and for the life of me I cannot get tlf to
> write my section [MO] in the exchange part of every entry.  It wants
> to
> force a "1" there, and either append my section on the call worked, or
> ignore it completely.
> 
> Have any of the folks using this for sweepstakes figured this out?
> Thanks.

The standardexchange needs to be written as 'Q91MO' (prec, check,
section, no spaces...), the serial number is taken from the log file.

I repaired a bug in writecabrillo.c, which produced a buffer overflow.

The bug is fixed in attached writecabrillo.c, in case you need it to
generate your cabrillo for the SS.

73,

Rein PA0R
> 
/*
 * Tlf - contest logging program for amateur radio operators
 * Copyright (C) 2001-2002-2003 Rein Couperus <[EMAIL PROTECTED]>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Library General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
	/* ------------------------------------------------------------
 	*   write cabrillo  file
 	*
 	*--------------------------------------------------------------*/
#include "writecabrillo.h"
#include "printcall.h"
#include "curses.h"

	int  write_cabrillo(void)
	{
	extern char backgrnd_str[];
	extern char logfile[];
	extern char call[];
	extern int cqww;
	extern int arrldx_usa;
	extern int other_flg;
	extern int wysiwyg_multi;
	extern int wysiwyg_once;
	extern int serial_grid4_mult;
	extern char mycqzone[];
	extern char exchange[];
	extern int cqwwm2;
	extern int arrlss;
	extern int wpx;
	extern char whichcontest[];


    char standardexchange[70] = "";
	char buf[181];
	char buffer[4000]= "";
	
	FILE *fp1,  *fp2;

	getsummary();
	
	if (strlen(exchange) > 0) strcpy (standardexchange, exchange);

	if  ( (fp1 = fopen(logfile,"r"))  == NULL){
			fprintf(stdout,  "Opening logfile not possible.\n");
			return(1);
		}
	if  ( (fp2 = fopen("./cabrillo","w"))  == NULL){
			fprintf(stdout,  "Opening cbr  file not possible.\n");
			return(2);
		}
	if (strlen(standardexchange) == 0) {
			nicebox (14,  0, 1, 78 , "Exchange used:");
			mvprintw(15, 1,  "                                                       ");
			mvprintw(15, 1,  "");
			attron(COLOR_PAIR(7) | A_STANDOUT);
			echo();
			if (arrlss == 1)
				getnstr(standardexchange,  6);
			else
				getnstr(standardexchange,  10);

			noecho();
	}

while ( !feof(fp1))
	{
		buf[0] = '\0';
		buffer[0]='\0';

		fgets (buf,  180,  fp1);

		if (buf[0] != ';' && strlen(buf) > 60)
		{

			buffer[0] = '\0';

			strcat(buffer, "QSO: ");
/*------------------------------------------------------------------
frequency
-------------------------------------------------------------------*/
			if  (buf[1]  == '6')
				strcat(buffer, " 1800");
			else  if (buf[1] ==  '8')
				strcat(buffer," 3500");
			else  if (buf[1] ==  '4')
				strcat(buffer," 7000");
			else  if (buf[1] ==  '2')
				strcat(buffer,"14000");
			else  if (buf[1] ==  '1' &&  buf[2] ==  '5')
				strcat(buffer,"21000");
			else  if (buf[1] ==  '1' &&  buf[2] ==  '0')
				strcat(buffer, "28000");

/*------------------------------------------------------------------
mode
-------------------------------------------------------------------*/

			if (buf[3] == 'C')
				strcat(buffer, " CW 20");
			else if (buf[3] == 'S')
				strcat(buffer, " PH 20");
			else
				strcat(buffer, " RY 20");

/*------------------------------------------------------------------
date
-------------------------------------------------------------------*/

			strncat(buffer, buf+14, 2); /* year */

			if (buf[10] == 'J' && buf[11] == 'a')
				strcat(buffer, "-01-");
			if (buf[10] == 'F')
				strcat(buffer, "-02-");
			if (buf[10] == 'M' && buf[12] == 'r')
				strcat(buffer, "-03-");
			if (buf[10] == 'A' && buf[12] == 'r')
				strcat(buffer, "-04-");
			if (buf[10] == 'M' && buf[12] == 'y')
				strcat(buffer, "-05-");
			if (buf[10] == 'J' && buf[11] == 'u' &&buf[12] == 'n')
				strcat(buffer, "-06-");
			if (buf[10] == 'J' && buf[12] == 'l')
				strcat(buffer, "-07-");
			if (buf[10] == 'A' && buf[12] == 'g')
				strcat(buffer, "-08-");
			if (buf[10] == 'S')
				strcat(buffer, "-09-");
			if (buf[10] == 'O')
				strcat(buffer, "-10-");
			if (buf[10] == 'N')
				strcat(buffer, "-11-");
			if (buf[10] == 'D')
				strcat(buffer, "-12-");
/*------------------------------------------------------------------
day
-------------------------------------------------------------------*/

			strncat(buffer, buf+7, 2);
/*------------------------------------------------------------------
time
-------------------------------------------------------------------*/

			strncat(buffer, buf+16, 3);
			strncat(buffer, buf+20, 3);
/*------------------------------------------------------------------
mycall
-------------------------------------------------------------------*/

			strncat(buffer, call, strlen(call) -1);         /* strip the \n */
			strncat(buffer, backgrnd_str, 15 - strlen(call));
/*------------------------------------------------------------------
exchange given
-------------------------------------------------------------------*/


			if (arrlss ==1)
			{
/*------------------------------------------------------------------
report given
-------------------------------------------------------------------*/

				sprintf(buffer + 41 , "%4d", atoi(buf+22));
				strcat(buffer, "                    ");
/*------------------------------------------------------------------
exchange given
-------------------------------------------------------------------*/
				sprintf(buffer + 46, "%c" , standardexchange[0]);
				strcat(buffer, "                    ");
				sprintf(buffer + 48, "%2d", atoi(standardexchange + 1));
				strcat(buffer, "                    ");
				sprintf(buffer + 51, "%s", standardexchange + 3);
				strcat(buffer, "                    ");
				sprintf(buffer + 55, "%s", buf + 29);
				strcat(buffer, "                    ");
/*------------------------------------------------------------------
exchange received
-------------------------------------------------------------------*/

				sprintf(buffer + 66, "%4d", atoi(buf+54));
				strcat(buffer, "                    ");
				sprintf(buffer + 71, "%c", buf[59]);
				strcat(buffer, "                    ");
				sprintf(buffer + 72, "%s", buf + 60);
				strcat(buffer, "                    ");
				sprintf(buffer + 75, "%s", buf + 63);
				strcat(buffer, "                    ");
				buffer[79] = '\0';
				strcat(buffer, "\n");

			}   else	// not arllss
			{
/*------------------------------------------------------------------
report given
-------------------------------------------------------------------*/


				if (buf[3] == 'S')
					strcat(buffer, "59  ");
				else
					strcat(buffer, "599 ");
/*------------------------------------------------------------------
exchange given
-------------------------------------------------------------------*/


				if (other_flg == 1|| wysiwyg_multi == 1 || wysiwyg_once == 1)
				{
					strcat(buffer, standardexchange);
					strncat(buffer, "            ", 7 - strlen(standardexchange));
				} /* end other (wysiwyg) */

				else if ((wpx == 1) || ((standardexchange[0] == '#')
					&& (strcmp (whichcontest, "ssa_mt") != 0)))
				{
						strncat(buffer, buf+23,4);
						strncat(buffer, standardexchange+1, 7);
						strcat (buffer, " ");
				}

				else if (cqww == 1){
					strcat(buffer, mycqzone);
					strcat(buffer, "     ");
				}

				else if (arrldx_usa == 1)
				{
					strncat(buffer, exchange, 2);
					strcat (buffer, "     ");

				}else if (serial_grid4_mult == 1) {
					strcat (buffer, "  ");
					sprintf(buffer + 49, "%s", buf+24);
					sprintf(buffer + 52, "%s", standardexchange + 1);

					strcat (buffer, "                ");
					sprintf(buffer + 60, "%s          ", buf+29);
					buffer[74] = '\0';
				}
				else
				{

					strncat(buffer, standardexchange, 10);
					strncat (buffer, "     ", strlen(buffer)-8);
				}

/*------------------------------------------------------------------
his call
-------------------------------------------------------------------*/

				if (strcmp (whichcontest, "ssa_mt") != 0) strncat(buffer, buf+29, 14);


/*------------------------------------------------------------------
rprt given
-------------------------------------------------------------------*/

				if (buf[3] == 'S')
					strcat(buffer, "59  ");
				else
					strcat(buffer, "599 ");

				if (serial_grid4_mult == 1) {
					char ssa_mt_exchange[30];
					int i=0, j=0, k = 0;
//					strncat(buffer, buf+54, 9);  // tbf for all contests? RC
					strcat(buffer, "                      ");

					sprintf(buffer + 79, "%03d   ", atoi(buf+54));

					for (i=0; i < 12; i++) {
						if (isalpha(buf[54+i])){
							for (j=0; j < (13 - i); j++) {
								if (isalnum(buf[54 + i + j])) {
									ssa_mt_exchange[k] = buf[54 + i + j];
									k++;
								}
								else {
									if (j > 0 && isspace(buf[54 + i + j - 1])){
										ssa_mt_exchange[k] = '\0';
										break;
									}
								}
							}
							if (j > 0) break;
						}
					}

					sprintf(buffer+83, "%s        ", ssa_mt_exchange);
					sprintf(buffer+90, "%s", "0");
				}
				else
					strncat(buffer, buf+54, 6);

				strcat(buffer, "  ");



				if ((cqww == 1) && (cqwwm2 == 1))
				{               // cqww M2 mode
					if (buf[79] == '*')
					{
						strcat(buffer, " 1\n");
					}
					else
						strcat(buffer, " 0\n");
				}
				else
				{
					if (strcmp(whichcontest, "ssa_mt") == 1)
						strcat(buffer, " 0\n");
					else
						strcat(buffer, "\n");
				}
			}       // end else arrlss

			if (strlen(buffer) > 11) fputs(buffer,fp2);

		}


	} // end while !eof

	fclose(fp1);
	fclose(fp2);


	fp2 = fopen("cabrillo","a");
	fputs("END-OF-LOG:\n", fp2);
	fclose(fp2);

	system("cat cabrillo >> header");
	system("cp header cabrillo");
	system ("mv header summary.txt");


	return(0);
	}


/* just >>TRIM<< */
char * trim(char * string)
 {
     int runner;
     size_t strLength = strlen(string);

     for (runner=0;runner<strLength;runner++) {
          if (*(string+runner)!=' ' && *(string+runner)!='\t') break;
      }

    strcpy(string,string+runner);
    strLength = strlen(string);

    for (runner=1;runner<strLength;runner++) {
        if (*(string+strLength-runner)!=' ' && *(string+strLength-runner)!='\t')
            break;
    }
  *(string+strLength-runner+1) = 0;
return(string);
}
/*
    The ADIF function has been written according ADIF v1.00 specifications
    as shown on http://home.no.net/jlog/adif/adif.html or http://www.adif.org
    LZ3NY
*/

int  write_adif(void) {

  extern char logfile[];
  extern char exchange[];
  extern char whichcontest[];
  extern int exchange_serial;
  extern char modem_mode[];

//  char buf[81]="";	### bug fix
  char buf[181]="";
   char buffer[181]= "";
  char standardexchange[70] = "";
  char adif_tmp_name[40]="";
  char adif_tmp_call[13]="";
  char adif_tmp_str[2]="";
  char adif_year_check[3]="";
  char adif_rcvd_num[16]="";
  char resultat[16];
  char adif_tmp_rr[5]="";

  int adif_mode_dep=0;

  FILE *fp1,  *fp2;

  if (strlen(exchange) > 0) strcpy (standardexchange, exchange);

  if  ( (fp1 = fopen(logfile,"r"))  == NULL){
      fprintf(stdout,  "Opening logfile not possible.\n");
      return(1);
  }
    strcpy(adif_tmp_name,whichcontest);
    strcat(adif_tmp_name,".adif");
        
  if  ( (fp2 = fopen(adif_tmp_name,"w"))  == NULL){
      fprintf(stdout,  "Opening ADIF file not possible.\n");
      return(2);
  }  else {
        fputs("######################################################################################\n",fp2);
        fputs("#                     ADIF v1.00 data file exported by TLF\n",fp2);
        fputs("# according to specifications on http://home.no.net/jlog/adif/adif.html\n",fp2);
        fputs("#\n",fp2);
        fputs("######################################################################################\n",fp2);
        fputs("<adif_ver:4>1.00\n<eoh>\n",fp2);
  }

  /* in case using write_adif() without write_cabrillo() */
  if ((strlen(standardexchange) == 0) && (exchange_serial!=1)) {
      nicebox (14,  0, 1, 78 , "Exchange used:");
      mvprintw(15, 1,  "                                                       ");
      mvprintw(15, 1,  "");
      attron(COLOR_PAIR(7) | A_STANDOUT);
      echo();

				  getnstr(standardexchange,  30);
      noecho();
    }

//while  (fgets (buf,  180,  fp1))		### bug fix
while  (fgets (buf,  sizeof(buf),  fp1))
  {
      if ((buf[0] != ';') && ((buf[0]!=' ')||(buf[1]!=' ')) && (buf[0]!='#') && (buf[0]!='\n') && (buf[0]!='\r')){
            buffer[0] = '\0';

/* CALLSIGN */
    strcat(buffer,"<CALL:");
    strncpy(adif_tmp_call,buf+29,12);
    strcpy(adif_tmp_call,trim(adif_tmp_call));
    snprintf(resultat, sizeof(resultat), "%d", strlen(adif_tmp_call));
    strcat(buffer,resultat);
    strcat(buffer,">");
    strcat(buffer,adif_tmp_call);

/* BAND */
      if  (buf[1]  == '6')
            strcat(buffer, "<BAND:4>160M");
      else  if (buf[1] ==  '8')
            strcat(buffer,"<BAND:3>80M");
      else  if (buf[1] ==  '4')
            strcat(buffer,"<BAND:3>40M");
      else  if (buf[1] ==  '3')
            strcat(buffer,"<BAND:3>30M");
      else  if (buf[1] ==  '2')
            strcat(buffer,"<BAND:3>20M");
      else  if (buf[1] ==  '1' &&  buf[2] ==  '5')
            strcat(buffer,"<BAND:3>15M");
      else  if (buf[1] ==  '1' &&  buf[2] ==  '7')
            strcat(buffer,"<BAND:3>17M");
      else  if (buf[1] ==  '1' &&  buf[2] ==  '0')
            strcat(buffer, "<BAND:3>10M");

/* QSO MODE */
      if (buf[3] == 'C')
            strcat(buffer, "<MODE:2>CW");
      else if (buf[3] == 'S')
            strcat(buffer, "<MODE:3>SSB");
      else if (strcmp (modem_mode, "RTTY") == 0)
      		strcat(buffer, "<MODE:4>RTTY");
      else
            strcat(buffer, "<MODE:4>DIGI");

/* QSO_DATE */
    /* Y2K :) */
    adif_year_check[0]='\0';
    strncpy(adif_year_check,buf+14,2);
    if (atoi(adif_year_check)<=70)  
      strcat(buffer, "<QSO_DATE:8>20");
    else
      strcat(buffer, "<QSO_DATE:8>19");

   /* year */
    strncat(buffer, buf+14, 2);

   /*month*/
      if (buf[10] == 'J' && buf[11] == 'a')
            strcat(buffer, "01");
      if (buf[10] == 'F')
            strcat(buffer, "02");
      if (buf[10] == 'M' && buf[12] == 'r')
            strcat(buffer, "03");
      if (buf[10] == 'A' && buf[12] == 'r')
            strcat(buffer, "04");
      if (buf[10] == 'M' && buf[12] == 'y')
            strcat(buffer, "05");
      if (buf[10] == 'J' && buf[11] == 'u' &&buf[12] == 'n')
            strcat(buffer, "06");
      if (buf[10] == 'J' && buf[12] == 'l')
            strcat(buffer, "07");
      if (buf[10] == 'A' && buf[12] == 'g')
            strcat(buffer, "08");
      if (buf[10] == 'S')
            strcat(buffer, "09");
      if (buf[10] == 'O')
            strcat(buffer, "10");
      if (buf[10] == 'N')
            strcat(buffer, "11");
      if (buf[10] == 'D')
            strcat(buffer, "12");

  /*date*/
    strncat(buffer,buf+7,2);

/* TIME_ON */
    strcat(buffer,"<TIME_ON:4>");
    strncat(buffer,buf+17,2); strncat(buffer,buf+20,2);

    /* RS(T) flag */
      if (buf[3] == 'S') adif_mode_dep=2; else  adif_mode_dep=3;

/* RST_SENT */
    strcat(buffer,"<RST_SENT:");
    adif_tmp_str[1]='\0';			/*	 PA0R 02/10/2003  */
	adif_tmp_str[0]=adif_mode_dep+48;
    strcat(buffer,adif_tmp_str);
    strcat(buffer,">");
    strncat(buffer,buf+44,adif_mode_dep);

/* STX - sent contest number */
    strcat(buffer,"<STX:");

      if ((exchange_serial==1)||(standardexchange[0] == '#')) {
            strcat(buffer,"4>");
            strncat(buffer, buf+23,4);       
      }  else {
            snprintf(resultat, sizeof(resultat), "%d", strlen(standardexchange));
            strcat(buffer,resultat);
            strcat(buffer,">");
            strcat(buffer,trim(standardexchange));
      }

/* RST_RCVD */
    strncpy(adif_tmp_rr,buf+49,4);
    strcpy(adif_tmp_rr,trim(adif_tmp_rr));
    strcat(buffer,"<RST_RCVD:");
    snprintf(resultat, sizeof(resultat), "%d", strlen(adif_tmp_rr));
    strcat(buffer,resultat);
    strcat(buffer,">");
    strncat(buffer,buf+49,adif_mode_dep);

/* SRX - received contest number */
    strncpy(adif_rcvd_num,buf+54,14);
    strcpy(adif_rcvd_num,trim(adif_rcvd_num));
    snprintf(resultat, sizeof(resultat), "%d", strlen(adif_rcvd_num));
    strcat(buffer,"<SRX:");
    strcat(buffer,resultat);
    strcat(buffer,">");
            if (strcmp(buf+54," ")!=0) strcat(buffer,adif_rcvd_num);
     
/* <EOR> */
    strcat(buffer, "<eor>\n");  //end of ADIF row
   }
             
            if (strlen(buffer) > 1) fputs(buffer,fp2);
   buffer[0]='\0';

  } // end fgets() loop

  fclose(fp1); fclose(fp2);

  return(0);
} // end write_adif



_______________________________________________
Tlf-devel mailing list
Tlf-devel@nongnu.org
http://lists.nongnu.org/mailman/listinfo/tlf-devel

Reply via email to