コード例 #1
0
ファイル: cw__test_helpers.cpp プロジェクト: trafi/djinni
bool cw__test_helpers_check_primitive_list(DjinniRecordHandle * pl) {
    djinni::Handle<DjinniRecordHandle> _pl(pl, primitive_list___delete);
    try {
        return ::testsuite::TestHelpers::check_primitive_list(DjinniPrimitiveList::toCpp(std::move(_pl)));
    }
    CW_TRANSLATE_EXCEPTIONS_RETURN(0);
}
コード例 #2
0
ファイル: dbverify.c プロジェクト: MarcNo/lifelines
/*===============================================
 * report_results -- Print out error & fix counts
 * Created: 2001/01/13, Perry Rapp
 *=============================================*/
static void
report_results (void)
{
    INT i, ct=0;
    for (i=0; i<ARRSIZE(errs); i++) {
        if (errs[i].err_count || errs[i].fix_count) {
            char buffer[64];
            printf("%s: ", _(errs[i].desc));
            snprintf(buffer, sizeof(buffer)
                     , _pl("%d error", "%d errors", errs[i].err_count)
                     , errs[i].err_count);
            printf("%s, ", buffer);
            snprintf(buffer, sizeof(buffer)
                     , _pl("%d fixed", "%d fixed", errs[i].fix_count)
                     , errs[i].fix_count);
            printf("%s\n", buffer);
            ct++;
        }
    }
    if (!ct) {
        printf("%s\n", _("No errors found"));
    }
}
コード例 #3
0
ファイル: loadsave.c プロジェクト: MarcNo/lifelines
static void
import_validating (void)
{
    char msg[100];
    STRING numstr=0;
    INT count=0;
    INT row=0;

    llwprintf(_("Checking GEDCOM file for errors.\n"));
    clear_rec_counts(0);

    numstr = _pl("Error", "Errors", count);
    row = 6;
    snprintf(msg, sizeof(msg), "%6ld %s", count, numstr);
    clear_stdout_hseg(row, 1, 70);
    wfield(row, 1, msg);

    numstr = _pl("Warning", "Warnings", count);
    row = 7;
    snprintf(msg, sizeof(msg), "%6ld %s", count, numstr);
    clear_stdout_hseg(row, 1, 70);
    wfield(row, 1, msg);
}
コード例 #4
0
ファイル: loadsave.c プロジェクト: MarcNo/lifelines
/*================================
 * Functions to display record counts
 *==============================*/
static void
update_rec_count (INT pass, char ctype, STRING tag, INT count)
{
    INT offset = 9*pass;
    char msg[100];
    STRING numstr=0;
    INT row=0;

    switch(ctype) {
    case 'I':
        numstr = _pl("Person", "Persons", count);
        row = 1;
        break;
    case 'F':
        numstr = _pl("Family", "Families", count);
        row = 2;
        break;
    case 'S':
        numstr = _pl("Source", "Sources", count);
        row = 3;
        break;
    case 'E':
        numstr = _pl("Event", "Events", count);
        row = 4;
        break;
    default:
        numstr = _pl("Other", "Others", count);
        row = 5;
        break;
    }
    snprintf(msg, sizeof(msg), "%6ld %s", count, numstr);
    if (row == 5 && tag && tag[0])
        llstrappf(msg, sizeof(msg), uu8, " (%s)", tag);
    row += offset;
    clear_stdout_hseg(row, 1, 70); /* TODO: how wide should this be ? */
    wfield(row, 1, msg);
}
コード例 #5
0
ファイル: benchmark_CK2.cpp プロジェクト: 2php/cgal
void do_main(const char *s) {

  // TYPEDEFS	
  typedef typename CK::Circular_arc_2      C2;
  typedef typename CK::Line_arc_2          L2;
  typedef typename CGAL::Arrangement_2<Traits>          Pmwx;
  typedef typename CGAL::Arr_naive_point_location<Pmwx> Point_location;
  
  // LOADING CURVES
  ArcContainer ac;
  std::ifstream fin;
  fin.open (s);
  CGAL::variant_load<CK, C2, L2>(
    fin, std::back_inserter(ac));
  fin.close(); 

  std::cout << "Size:" << ac.size() << std::endl;
  
  // BENCHMARKING
  Pmwx _pm;
  Point_location _pl(_pm);
  struct rusage before, after;
  struct timeval utime, stime;
  getrusage(RUSAGE_SELF,&before);
  insert(_pm,ac.begin(),ac.end(),boost::false_type());
  getrusage(RUSAGE_SELF,&after);
  timersub(&(after.ru_utime),&(before.ru_utime),&utime);
  timersub(&(after.ru_stime),&(before.ru_stime),&stime);
  std::cout<<"Time="<< utime.tv_sec<<"."<< std::setw(6) << 
  std::setfill('0')<< utime.tv_usec <<std::endl;

  std::cerr << utime.tv_sec << "." << std::setw(6) << 
  std::setfill('0')<< utime.tv_usec << std::endl;

  std::cout << "The arrangement size:" << std::endl
            << "   V = " << _pm.number_of_vertices()
            << ",  E = " << _pm.number_of_edges() 
            << ",  F = " << _pm.number_of_faces() << std::endl;

}
コード例 #6
0
ファイル: progerr.c プロジェクト: disassembler/Lifelines
/*=============================================+
 * prog_var_error_zstr -- Report a run time program error
 *  node:  [IN]  current parse node
 *  stab:  [IN]  current symbol table (lexical scope)
 *  arg:   [IN]  if non-null, parse node of troublesome argument
 *  val:   [IN]  if non-null, PVALUE of troublesome argument
 *  zstr:  [IN]  message
 *
 * Inline debugger is implemented here
 * See vprog_error
 * Created: 2002/02/17, Perry Rapp
 *============================================*/
static void
prog_var_error_zstr (PNODE node, SYMTAB stab, PNODE arg, PVALUE val, ZSTR zstr)
{
	STRING choices[5];
	INT rtn=0;
	SYMTAB curstab = stab; /* currently displayed symbol table */
	INT nlevels=0; /* number frames on callstack */
	INT curlevel=0; /* 0 is lowest */

	ASSERT(zstr);

	if (val) {
		ZSTR zval = describe_pvalue(val);
		zs_appf(zstr, " (value: %s)", zs_str(zval));
	} else if (arg) {
		INT max=40 + zs_len(zstr); /* not too much argument description */
		/* arg isn't evaluated, but describe will at least give its type */
		zs_apps(zstr, " (arg: ");
		describe_pnode(arg, zstr, max);
		zs_apps(zstr, ")");
	}
	prog_error(node, zs_str(zstr));
	zs_free(&zstr);

	if (dbg_mode != -99 && dbg_mode != 3) {
		INT ch = 0;
		while (!(ch=='d' || ch=='q'))
			ch = rptui_prompt_stdout(_("Enter d for debugger, q to quit"));
		if (ch == 'q')
			dbg_mode = -99;
	}

	/* call stack size & location */
	nlevels = count_symtab_ancestors(stab) + 1;
	curlevel = 0;

	/* report debugger loop */
	while (dbg_mode != -99) {
		ZSTR zstr=zs_new();
		INT n=0;
		/* 0: display local variable(s) */
		n = (curstab->tab ? get_table_count(curstab->tab) : 0);
		zs_setf(zstr, _pl("Display local (%d var)",
			"Display locals (%d vars)", n), n);
		zs_appf(zstr, " [%s]", curstab->title);
		choices[0] = strsave(zs_str(zstr));
		/* 1: display global variables */
		n = (globtab->tab ? get_table_count(globtab->tab) : 0);
		zs_setf(zstr, _pl("Display global (%d var)",
			"Display globals (%d vars)", n), n);
		choices[1] = strsave(zs_str(zstr));
		/* 2: up call stack */
		n = nlevels - curlevel - 1;
		zs_setf(zstr, _pl("Call stack has %d higher level", "Call stack has %d higher levels", n), n);
		zs_apps(zstr, ". ");
		if (n > 0) {
			zs_apps(zstr, _(" Go up one level"));
			zs_appf(zstr, "(%s)", curstab->parent->title);
		}
		choices[2] = strsave(zs_str(zstr));
		/* 3: down call stack */
		n = curlevel;
		zs_setf(zstr, _pl("Call stack has %d lower level", "Call stack has %d lower levels", n), n);
		zs_apps(zstr, ". ");
		if (n > 0) {
			CNSTRING title = get_symtab_ancestor(stab, n-1)->title;
			zs_apps(zstr, _(" Go down one level"));
			zs_appf(zstr, "(%s)", title);
		}
		choices[3] = strsave(zs_str(zstr));
		/* quit */
		choices[4] = strsave(_("Quit debugger"));
dbgloop:
		rtn = rptui_choose_from_array(_("Report debugger"), ARRSIZE(choices), choices);
		if (rtn == 4 || rtn == -1) {
			dbg_mode = -99;
		} else if (rtn == 0) {
			disp_symtab(_("Local variables"), curstab);
			goto dbgloop;
		} else if (rtn == 1) {
			disp_symtab(_("Global variables"), globtab);
			goto dbgloop;
		} else if (rtn == 2) {
			if (curlevel+1 < nlevels) {
				curstab = curstab->parent;
				++curlevel;
				ASSERT(curstab);
			}
		} else if (rtn == 3) {
			if (curlevel > 0) {
				curstab = get_symtab_ancestor(stab, curlevel-1);
				--curlevel;
				ASSERT(curstab);
			}
		}
		zs_free(&zstr);
		free_array_strings(ARRSIZE(choices), choices);
	}
}
コード例 #7
0
ファイル: dbcontext.c プロジェクト: MarcNo/lifelines
/*===================================================
 * describe_dberror -- Describe database opening error
 * dberr:  [in] error whose description is sought
 * buffer: [out] buffer for description
 * buflen: [in]  size of buffer
 *=================================================*/
void
describe_dberror (INT dberr, STRING buffer, INT buflen)
{
	STRING b=buffer;
	INT n=buflen, u8=uu8;
	buffer[0]=0;
	if (dberr != BTERR_WRITER)
		llstrncpy(buffer, _("Database error: -- "), buflen, 0);

	switch (dberr) {
	case BTERR_NODB:
		llstrapps(b, n, u8, _("requested database does not exist."));
		break;
	case BTERR_DBBLOCKEDBYFILE:
		llstrapps(b, n, u8, _("db directory is file, not directory."));
		break;
	case BTERR_DBCREATEFAILED:
		llstrapps(b, n, u8, _("creation of new database failed."));
		break;
	case BTERR_DBACCESS:
		llstrapps(b, n, u8, _("error accessing database directory."));
		break;
	case BTERR_NOKEY:
		llstrapps(b, n, u8, _("no keyfile (directory does not appear to be a database)."));
		break;
	case BTERR_INDEX:
		llstrapps(b, n, u8,  _("could not open, read or write an index file."));
		break;
	case BTERR_KFILE:
		llstrapps(b, n, u8,  _("could not open, read or write the key file."));
		break;
	case BTERR_KFILE_ALTERDB:
		llstrapps(b, n, u8,  _("could not open, read or write the key file (to alter database)."));
		break;
	case BTERR_BLOCK:
		llstrapps(b, n, u8,  _("could not open, read or write a block file."));
		break;
	case BTERR_LNGDIR:
		llstrapps(b, n, u8,  _("name of database is too long."));
		break;
	case BTERR_WRITER:
		llstrapps(b, n, u8,  _("The database is already open for writing."));
		break;
	case BTERR_LOCKED:
		llstrapps(b, n, u8,  _("The database is locked (no readwrite access)."));
		break;
	case BTERR_UNLOCKED:
		llstrapps(b, n, u8,  _("The database is unlocked."));
		break;
	case BTERR_ILLEGKF:
		llstrapps(b, n, u8,  _("keyfile is corrupt."));
		break;
	case BTERR_ALIGNKF:
		llstrapps(b, n, u8,  _("keyfile is wrong alignment."));
		break;
	case BTERR_VERKF:
		llstrapps(b, n, u8,  _("keyfile is wrong version."));
		break;
	case BTERR_EXISTS:
		llstrapps(b, n, u8,  _("Existing database found."));
		break;
	case BTERR_READERS:
		llstrappf(b, n, u8
			, _pl("The database is already opened for read access by %d user."
				, "The database is already opened for read access by %d users."
				, rdr_count)
			, rdr_count);
		break;
	case BTERR_BADPROPS:
		llstrapps(b, n, u8,  _("Invalid properties set for new database"));
		break;
	default:
		llstrapps(b, n, u8,  _("Undefined database error -- fix program."));
		break;
	}
}
コード例 #8
0
ファイル: add.c プロジェクト: MarcNo/lifelines
/*==========================================================
 * get_unresolved_ref_error -- get string for unresolved reference(s)
 *  xgettext doesn't support special keywords for plural forms, AFAIK
 *  so we can't put these in static variables
 *========================================================*/
STRING
get_unresolved_ref_error_string (INT count)
{
	return _pl("There was %d unresolved reference."
		, "There were %d unresolved references.", count);
}
コード例 #9
0
ファイル: benchmark_CK2.cpp プロジェクト: 2php/cgal
void do_main(int k) {

  // TYPEDEFS	
  typedef typename CK::Circular_arc_2      C2;
  typedef typename CK::Point_2 Point_2;
  typedef typename CK::FT FT;
  typedef typename CGAL::Arrangement_2<Traits>          Pmwx;
  typedef typename CGAL::Arr_naive_point_location<Pmwx> Point_location;
  
  // LOADING CURVES
  ArcContainer ac;

  double cx, cy;
  const FT rft(1.0);  

  // DENSE
  if(k == 0) {
    for(cx = 0.0; cx <= 10.0; cx += 0.5) {
      for(cy = 0.0; cy <= 10.0; cy += 0.5) {
        ac.push_back(typename CK::Circular_arc_2 ( typename CK::Circle_2(Point_2(cx,cy),rft) ) );
      }
    }
  }

  // VERY DENSE
  if(k == 1) {
    for(cx = 0.0; cx <= 0.2; cx += 0.01) {
      for(cy = 0.0; cy <= 0.2; cy += 0.01) {
        ac.push_back(typename CK::Circular_arc_2 ( typename CK::Circle_2(Point_2(cx,cy),rft) ));
      }
    }
  }

  // ONE CIRCLE
  if(k == 2) {
    ac.push_back(typename CK::Circular_arc_2 ( typename CK::Circle_2(Point_2(0,0),5) ));
  }

  // RANDOM CASE
  if(k == 3) {
    CGAL::Random generatorOfgenerator;
    int random_seed = generatorOfgenerator.get_int(0, 123456);
    CGAL::Random theRandom(random_seed);
    for(int i=0; i<100; i++) {
      double x = theRandom.get_double(0.0,1.0);
      double y = theRandom.get_double(0.0,1.0);
      double r = theRandom.get_double(0.00001,1.0);
      ac.push_back(typename CK::Circular_arc_2 ( typename CK::Circle_2(Point_2(x,y),FT(r)) ));
    }
  }
  
  // SPARSE
  if(k == 4) {
    double h = (std::sqrt(3.0)+0.01);
    for(cx = 0.0; cx <= 40.4; cx += 2.01) {
      for(cy = h; cy <= h*20; cy += h*2) {
        ac.push_back(typename CK::Circular_arc_2 ( typename CK::Circle_2(Point_2(cx+1.0,cy),rft) ));
      }
      for(cy = 0.0; cy <= h*20.0; cy += h*2) {
        ac.push_back(typename CK::Circular_arc_2 ( typename CK::Circle_2(Point_2(cx,cy),rft)));
      }
    }
  }

  std::cout << "Size:" << ac.size() << std::endl;
  
  // BENCHMARKING
  Pmwx _pm;
  Point_location _pl(_pm);
  struct rusage before, after;
  struct timeval utime, stime;
  getrusage(RUSAGE_SELF,&before);
  insert(_pm,ac.begin(),ac.end(),boost::false_type());
  getrusage(RUSAGE_SELF,&after);
  timersub(&(after.ru_utime),&(before.ru_utime),&utime);
  timersub(&(after.ru_stime),&(before.ru_stime),&stime);
  std::cout<<"Time="<< utime.tv_sec<<"."<< std::setw(6) << 
  std::setfill('0')<< utime.tv_usec << std::endl;

  std::cerr << utime.tv_sec << "." << std::setw(6) << 
  std::setfill('0')<< utime.tv_usec << std::endl;

  std::cout << "The arrangement size:" << std::endl
            << "   V = " << _pm.number_of_vertices()
            << ",  E = " << _pm.number_of_edges() 
            << ",  F = " << _pm.number_of_faces() << std::endl;
}
コード例 #10
0
int	WINAPI WKInitRecording(HWND hParent)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	if(!pInter){
		AfxMessageBox("Container not found!!!");
		return 0;
	}
	if(hMacroRecControlWindow!=0){
		AfxMessageBox(_pl("To record new macro, You have to stop\nrecording previous macro"));
		return 0;
	}
	static long lMacroCounter=1;
	plgOptions.sLastMacroName="";
	COleDateTime dt=COleDateTime::GetCurrentTime();
	plgOptions.sLastMacroName.Format("%s (%02lu.%02lu.%04lu)",GetRandomName(),dt.GetDay(),dt.GetMonth(),dt.GetYear());
	lMacroCounter++;
	char szPrefFolder[MAX_PATH]="";
	pInter->GetPreferencesFolder(szPrefFolder,sizeof(szPrefFolder));
	CString sTargetFile=szPrefFolder;
	sTargetFile+="RecorderMacro\\";
	if(int(GetFileAttributes(sTargetFile))==-1){
		::CreateDirectory(sTargetFile,NULL);
	}
	plgOptions.sLastMacroContent="";
	DWORD dwStart=GetTickCount();
	ATOM at=GlobalAddAtom("WK_RECORDING");
	DWORD dwRes=DialogBox(WKGetPluginContainer()->GetPluginDllInstance(),MAKEINTRESOURCE(IDD_OPTIONS),hParent,OptionsDialogProc);
	if(!WKUtils::isWKUpAndRunning()){
		return 0;
	}
	GlobalDeleteAtom(at);
	if(dwRes!=0){
		// Пользователь отказался...
		return 0;
	}
	if(pInter){
		pInter->PushMyOptions(0);
	}
	if(plgOptions.sLastMacroContent==""){
		return 0;
	}
	CString sMacroFileNm=plgOptions.sLastMacroName;
	MakeSafeFileName(sMacroFileNm);
	sTargetFile+=sMacroFileNm;
	sTargetFile+=".wkm";
	// Добавлять иконку на время записи макроса
	// Префикс макроса...
	CString sMacroTemplate=	"// Language: %s\r\n"\
							"// Title: %s\r\n"\
							"// Description: Recorded macro\r\n"\
							"// ParamType: String\r\n"\
							"// Hint: wait_for_key_release;\r\n\r\n"\
							"%s"\
							"%s"\
							"\r\n"\
							"// <wkMain>: Action\r\n"\
							"function wkMain()\r\n"\
							"{// wkMain description: Replay keystrokes\r\n"\
							"%s"\
							"};\r\n"\
							"// </wkMain>: End of Action\r\n"\
							"\r\n";
	CString sDopFunc=		(plgOptions.lMFormat==0 || plgOptions.lMFormat==1 || plgOptions.lMFormat==3)?"":"// System object that will be used to replay recorded keystrokes\r\nvar WshShell = new ActiveXObject('WScript.Shell');\r\n";
	sDopFunc+=				"// Playback Speed ratio ('1' means as recorded)\r\n";
	sDopFunc+=				"var iMacroSpeed = 1.0;";
	sDopFunc+=				"\r\n";
	CString sWaitFunc=		(plgOptions.lMFormat==0 || plgOptions.lMFormat==1 || plgOptions.lMFormat==3)?"":"function Wait(time)\r\n"\
							"{\r\n"\
							"	var d = new Date();\r\n"\
							"	var timeCounter = 0;\r\n"\
							"	while((new Date()).getSeconds()-d.getSeconds()<(time*iMacroSpeed)){\r\n"\
							"		timeCounter++;\r\n"\
							"	};\r\n"\
							"}\r\n";
	plgOptions.sLastMacroContent=Format(sMacroTemplate,(plgOptions.lMFormat==0 || plgOptions.lMFormat==1 || plgOptions.lMFormat==3)?"JScript":"JScript",plgOptions.sLastMacroName,sDopFunc,(plgOptions.bRecPauses?sWaitFunc:""),plgOptions.sLastMacroContent);
	DWORD dwStop=GetTickCount();
	CString sTime;
	sTime.Format("%.2f",double(dwStop-dwStart)/1000);
	int iRes=::MessageBox(NULL,_pl("Macro recorded")+"!\n"+_pl("Duration")+": "+sTime+_pl("sec")+". "+_pl("Continue")+"?",_pl("Macro successfully recorded")+"!",IDOK);
	if(iRes==IDOK){
		SaveFile(sTargetFile,plgOptions.sLastMacroContent);
		if(plgOptions.bAP_Add2WK && pInter){
			pInter->AddQrunFromFile(sTargetFile);
		}
		if(plgOptions.bAP_OpenInEd && pInter){
			int iRes=(int)::ShellExecute(NULL,"open","notepad.exe",CString("\"")+sTargetFile+CString("\""),NULL,SW_SHOWNORMAL);
		}
	}
	return 1;
}
コード例 #11
0
int	WINAPI WKPluginOptionsManager(int iAction, WKOptionsCallbackInterface* pOptionsCallback, DWORD dwParameter)
{
	if(iAction==OM_STARTUP_ADD){
		pOptionsCallback->AddListOption("ActWnds","Recording: How to replay switches between applications during macro recording","Here you can define how to record application switches, for example you can define to record keystrokes separately",_pl("Ignore switches")+"\t"+_pl("Switch active application during macro replay as recorded")+"\t"+_pl("Replay keystrokes for active application only"),0,0);
		pOptionsCallback->AddBoolOption("RecordPauses","Recording: record pauses between keystrokes too","",0,0);
		pOptionsCallback->AddListOption("MFormat","Record format","Internal format is more powerful - can record all keys and mouse actions, JScript-SendKeys format can record keystrokes only but recorded macro can be used without WireKeys at all",_pl("Internal format")+"\t"+_pl("JScript-SendKeys"),0,0);
		pOptionsCallback->AddNumberOption("PauseLevel","Recording: record pauses between keystrokes that are bigger than (seconds)","",3,0,100,0);
		pOptionsCallback->AddBoolOption("OpenInEditor","After recording: open macro in text editor","",0,0);
		pOptionsCallback->AddBoolOption("Add2WK","After recording: add macro to WireKeys","",TRUE,0);
	}
	if(iAction==OM_STARTUP_ADD || iAction==OM_OPTIONS_SET){
		plgOptions.bRecPauses=pOptionsCallback->GetBoolOption("RecordPauses");
		plgOptions.lPauseLevel=pOptionsCallback->GetNumberOption("PauseLevel");
		plgOptions.bAppSwitchesRTyp=pOptionsCallback->GetListOption("ActWnds");
		plgOptions.bAP_OpenInEd=pOptionsCallback->GetBoolOption("OpenInEditor");
		plgOptions.bAP_Add2WK=pOptionsCallback->GetBoolOption("Add2WK");
		plgOptions.lMFormat=pOptionsCallback->GetListOption("MFormat");
	}
	if(iAction==OM_OPTIONS_GET){
		pOptionsCallback->SetBoolOption("RecordPauses",plgOptions.bRecPauses);
		pOptionsCallback->SetNumberOption("PauseLevel",plgOptions.lPauseLevel);
		pOptionsCallback->SetListOption("ActWnds",plgOptions.bAppSwitchesRTyp);
		pOptionsCallback->SetBoolOption("OpenInEditor",plgOptions.bAP_OpenInEd);
		pOptionsCallback->SetBoolOption("Add2WK",plgOptions.bAP_Add2WK);
		pOptionsCallback->SetListOption("MFormat",plgOptions.lMFormat);
	}
	return 1;
}
コード例 #12
0
ファイル: import.c プロジェクト: MarcNo/lifelines
/*=================================================
 * do_import -- Read GEDCOM file to database
 *  ifeed: [IN]  output methods
 *  fp:    [I/O] GEDCOM file whence to load data
 *===============================================*/
static BOOLEAN
do_import (IMPORT_FEEDBACK ifeed, FILE *fp)
{
	NODE node, conv;
	XLAT ttm = 0;
	STRING msg;
	BOOLEAN emp;
	INT nindi = 0, nfam = 0, neven = 0;
	INT nsour = 0, nothr = 0, type, num = 0;
	INT totkeys = 0, totused = 0;
	char msgbuf[80];
	BOOLEAN succeeded=FALSE;
	STRING str,unistr=0;
	ZSTR zerr=0;
	TABLE metadatatab = create_table_str();
	STRING gdcodeset=0;
	INT warnings=0;

	/* start by assuming default */
	strupdate(&gdcodeset, gedcom_codeset_in);

/*	rptui_init(); *//* clear ui time counter */

/* Open and validate GEDCOM file */
	if ((unistr=check_file_for_unicode(fp)) && !eqstr(unistr, "UTF-8")) {
		msg_error(_(qSunsupuniv), unistr);
		goto end_import;
	}
	if (eqstr_ex(unistr, "UTF-8")) {
		strupdate(&gdcodeset, "UTF-8");
	}

	if (!scan_header(fp, metadatatab, &zerr)) {
		msg_error(zs_str(zerr));
		goto end_import;
	}

	if ((str = valueof_str(metadatatab, "GEDC.FORM"))!= NULL) {
		if (!eqstr(str, "LINEAGE-LINKED")) {
			if (!ask_yes_or_no_msg(
				_("This is not a lineage linked GEDCOM file.")
				, _("Proceed anyway?")
				))
				goto end_import;
		}
	}
	if (!unistr && (str = valueof_str(metadatatab, "CHAR"))!= NULL) {
		/* if no BOM, use file's declared encoding if present */
		strupdate(&gdcodeset, str);
	}

	/* TODO: Push this codeset question down to after the validation, where we can know if
	the incoming file happened to really be all ASCII */

	if (!int_codeset[0]) {
		/* TODO: ask if user would like to adopt codeset of incoming file, if we found it */
		if (!ask_yes_or_no_msg(
			_("No current internal codeset, so no codeset conversion can be done")
			, _("Proceed without codeset conversion?")
			))
			goto end_import;
	}

	/* Warn if lossy code conversion likely */
	if (gdcodeset[0] && int_codeset[0]) {
		if (is_lossy_conversion(gdcodeset, int_codeset)) {
			ZSTR zstr=zs_new();
			zs_setf(zstr, _("Lossy codeset conversion (from <%s> to <%s>) likely")
				, gdcodeset, int_codeset);
			if (!ask_yes_or_no_msg(
				zs_str(zstr)
				, _("Proceed anyway?")
				))
				goto end_import;
		}
	}

	/* validate */
	if (ifeed && ifeed->validating_fnc)
		(*ifeed->validating_fnc)();

	if (!validate_gedcom(ifeed, fp)) {
		if (ifeed && ifeed->error_invalid_fnc)
			(*ifeed->error_invalid_fnc)(_(qSgdnadd));
		goto end_import;
	}
	warnings = validate_get_warning_count();
	if (warnings) {
		ZSTR zstr=zs_new();
		zs_setf(zstr, _pl("%d warning during import",
			"%d warnings during import", warnings), warnings);
		if (!ask_yes_or_no_msg(zs_str(zstr), _(qSproceed))) {
			goto end_import;
		}
	}

	if (gdcodeset[0] && int_codeset[0]) {
retry_input_codeset:
		ttm = transl_get_xlat(gdcodeset, int_codeset);
		if (!transl_is_xlat_valid(ttm)) {
			ZSTR zstr=zs_new();
			char csname[64];
			BOOLEAN b;
			transl_release_xlat(ttm);
			ttm = 0;
			zs_setf(zstr, _("Cannot convert codeset (from <%s> to <%s>)")
				, gdcodeset, int_codeset);
			b = ask_for_string(zs_str(zstr)
				, _("Enter codeset to assume (* for none)")
				, csname, sizeof(csname)) && csname[0];
			zs_free(&zstr);
			if (!b)
				goto end_import;
			if (!eqstr(csname, "*")) {
				strupdate(&gdcodeset, csname);
				goto retry_input_codeset;
			}
		}
	}
	
	if((num_indis() > 0)
		|| (num_fams() > 0)
		|| (num_sours() > 0)
		|| (num_evens() > 0)
		|| (num_othrs() > 0)) gd_reuse = FALSE;
	else if((gd_reuse = check_stdkeys())) {
		totused = gd_itot + gd_ftot + gd_stot + gd_etot + gd_xtot;
		totkeys = gd_imax + gd_fmax + gd_smax + gd_emax + gd_xmax;
		if((totkeys-totused) > 0) {
			INT delkeys = totkeys-totused;
			snprintf(msgbuf, sizeof(msgbuf)
				, _pl("Using original keys, %d deleted record will be in the database."
					, "Using original keys, %d deleted records will be in the database."
					, delkeys)
				, delkeys
				);
		}
		else strcpy(msgbuf, " ");
		gd_reuse = ask_yes_or_no_msg(msgbuf, _(qScfoldk));
/*
TODO: why were these here ?
		touchwin(uiw_win(stdout_win));
		wrefresh(uiw_win(stdout_win));
*/
	}

	/* start loading the file */
	rewind(fp);

	/* test for read-only database here */

	if(readonly) {
		if (ifeed && ifeed->error_readonly_fnc)
			(*ifeed->error_readonly_fnc)();
		goto end_import;
	}

	/* tell user we are beginning real part of import */
	if (ifeed && ifeed->beginning_import_fnc) {
		if(gd_reuse)
			(*ifeed->beginning_import_fnc)(_(qSdboldk));
		else
			(*ifeed->beginning_import_fnc)(_(qSdbnewk));
	}


/* Add records to database */
	node = convert_first_fp_to_node(fp, FALSE, ttm, &msg, &emp);
	while (node) {
		if (!(conv = node_to_node(node, &type))) {
			free_nodes(node);
			node = next_fp_to_node(fp, FALSE, ttm, &msg, &emp);
			continue;
		}
		switch (type) {
		case INDI_REC: num = ++nindi; break;
		case FAM_REC:  num = ++nfam;  break;
		case EVEN_REC: num = ++neven; break;
		case SOUR_REC: num = ++nsour; break;
		case OTHR_REC: num = ++nothr; break;
		default: FATAL();
		}
		restore_record(conv, type, num);
		if (ifeed && ifeed->added_rec_fnc)
			ifeed->added_rec_fnc(nxref(conv)[1], ntag(conv), num);
		free_nodes(node);
		node = next_fp_to_node(fp, FALSE, ttm, &msg, &emp);
	}
	if (msg) {
		msg_error(msg);
	}
	if(gd_reuse && ((totkeys - totused) > 0)) {
		if (ifeed && ifeed->adding_unused_keys_fnc)
			(*ifeed->adding_unused_keys_fnc)();
		addmissingkeys(INDI_REC);
		addmissingkeys(FAM_REC);
		addmissingkeys(EVEN_REC);
		addmissingkeys(SOUR_REC);
		addmissingkeys(OTHR_REC);
	}
	succeeded = TRUE;

end_import:
	validate_end_import();
	zs_free(&zerr);
	destroy_table(metadatatab);
	strfree(&gdcodeset);
	return succeeded;
}