804 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			804 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /*
 | |
| @(C$)
 | |
| MAXTEXTLEN      : Lunghezza massima di un file di testo (in righe)
 | |
| LFLOG           : Numero logico del primo file elaborabile dalla dumpfile
 | |
| -------------------------------------------------------------------------------
 | |
| */
 | |
| #include				<ccommon.h>
 | |
| #include				<genconst.h>
 | |
| #include				<ccustio.h>
 | |
| #include				<cfiles.h>
 | |
| #include				<cbpltree.h>
 | |
| #include				<cbplcre.h>
 | |
| #include				<cisam.h>
 | |
| #include				<memory.h>
 | |
| #include				<progind.h>
 | |
| 
 | |
| #define	MAXTEXTLEN		8096
 | |
| 
 | |
| extern BOOLEAN			dispferr;
 | |
| HIDDEN int rd = 0;
 | |
| 
 | |
| /*
 | |
| @($) cupdatefile  ISAM
 | |
| 
 | |
| @(ID)
 | |
| Aggiorna un file ISAM utilizzando un nuovo tracciato record.
 | |
| Ritorna il codice di errore.
 | |
| @(FD)
 | |
| 
 | |
| @(ISV)
 | |
| ws  = stringa di lavoro.
 | |
| 
 | |
| wisfd    = descrittore del file in esame.
 | |
| 
 | |
| oldrec   = buffer contenente il vecchio record.
 | |
| 
 | |
| newrec   = buffer contenente il nuovo record.
 | |
| 
 | |
| tmpf     = descrittore del file.
 | |
| 
 | |
| tmpname  = nome del file.
 | |
| 
 | |
| filename = nome del file.
 | |
| 
 | |
| nsec     = variabile di lavoro.
 | |
| 
 | |
| i,j,k    = contatori.
 | |
| 
 | |
| junk     = variabile spazzatura per la chiamata di varie funzioni.
 | |
| 
 | |
| d        = descrittore del file.
 | |
| 
 | |
| @(FSV)
 | |
| 
 | |
| */
 | |
| 
 | |
| int	cupdatefile(logicname,lenr,newrecdes,vis,err)
 | |
| int						logicname;  /* numero logico del file                       */
 | |
| unsigned int	lenr;       /* lunghezza nuovo record                       */
 | |
| RecDes				*newrecdes; /* nuovo tracciato record                       */
 | |
| BOOLEAN				vis;        /* se true visualizza cio' che sta facendo      */
 | |
| int						*err;       /* codice errore                                */
 | |
| 
 | |
| 	{
 | |
| 		char 			ws[256];
 | |
| 		isfdptr		wisfd;
 | |
| 		RecType		oldrec,newrec;
 | |
| 		SecDef		tmpf;
 | |
| 		PathSt		tmpname, filename;
 | |
| 		RecNoType	nsec,i,k;
 | |
| 		int				junk,j;
 | |
| 		FileDes		d;
 | |
| 		FILE			*fd;
 | |
| 		char			s[81];
 | |
| 
 | |
| 		*err = NoErr;
 | |
| 		COpenDir ( ManuLock , NORDIR);
 | |
| 		CGetFile(logicname, &d, NoLock, NORDIR);
 | |
| 		CCloseDir(NORDIR);
 | |
| 		if (d.EOX == 0)
 | |
| 		{
 | |
| 			COpenDir ( ManuLock , NORDIR); 
 | |
| 			CGetFile(logicname, &d, Lock, NORDIR);
 | |
| 			d.LenR = lenr ;
 | |
| 			CPutFile(logicname, &d, NORDIR);
 | |
| 			CCloseDir(NORDIR);
 | |
| 			COpenRecDir(ManuLock, NORDIR);
 | |
| 			CPutRec(logicname, newrecdes, NORDIR);
 | |
| 			CCloseRecDir(NORDIR);
 | |
| #ifndef DOS
 | |
| 			writelog(FNCHGREC, NULL, (RecType) newrecdes);
 | |
| #endif
 | |
| 			strcpy(tmpname, CAddPref(d.SysName));
 | |
| 			if ((fd = fopen(tmpname, "r")) == NULL)
 | |
| 				*err = cisbuild(wisfd, logicname, d.EOX, err);
 | |
| 			else fclose(fd);
 | |
| 			return(*err);
 | |
| 		}
 | |
| 		if (cisopen(&wisfd, logicname, &oldrec, ExclLock, err)) return(*err);
 | |
| 		strcpy(tmpname, CInsPref("tmp.dta", NORDIR));
 | |
| 		nsec = ((RecNoType) lenr * wisfd->d->EOX) / BlockLenIO + 1;
 | |
| 		CCreate(&tmpf, tmpname, lenr, 0, nsec);
 | |
| 		COpen(&tmpf, tmpname, lenr, 0, ExclLock);
 | |
| 		if ((*err = tmpf.IOR))
 | |
| 		{
 | |
| 			junk = cisclose(&wisfd, &oldrec, &junk);
 | |
| 			unlink(tmpname) ;
 | |
| 			return(*err);
 | |
| 		}
 | |
| 		newrec = (RecType) malloc(lenr);
 | |
| 		k = 0L;
 | |
| 		i = 0L;
 | |
| 		if (vis)
 | |
| 		{
 | |
| 			sprintf(s, "Aggiorna - %s", wisfd->d->Des);
 | |
| 			progind_create(wisfd->d->EOD, s, FALSE, TRUE, 10);
 | |
| 		}
 | |
| 		dispferr = FALSE;
 | |
| 		while (i < wisfd->d->EOD)
 | |
| 		{
 | |
| 			i++;
 | |
| 			CRead(&wisfd->f, oldrec, i, NoLock);
 | |
| 			if ((*err = wisfd->f.IOR)) break ;
 | |
| 			if ((vis) && ((i % 10) == 0))
 | |
| 				progind_set_status(i);
 | |
| 			if (!IRecIsDeleted(oldrec))
 | |
| 			{
 | |
| 				k++;
 | |
| 				CZeroRec(newrecdes, newrec);
 | |
| 				for (j = 0; j < newrecdes->NFields; j++)
 | |
| 				{
 | |
| 					strcpy(ws, "");
 | |
| 					if (!CGetFieldBuff(newrecdes->Fd[j].Name, wisfd->r, oldrec, ws))
 | |
| 					 junk = CPutFieldBuff(newrecdes->Fd[j].Name, newrecdes, ws, newrec);
 | |
| 				}
 | |
| 				CWrite(&tmpf, newrec, k, NoLock);
 | |
| 			}
 | |
| 		}
 | |
| 		dispferr = TRUE;
 | |
| 		CClose(&tmpf);
 | |
| 		if (vis) progind_set_status(i);
 | |
| 		strcpy(filename, wisfd->d->SysName);
 | |
| 		junk = cisclose(&wisfd, &oldrec, &junk);
 | |
| 		if (!*err)
 | |
| 		{
 | |
| 			COpenDir ( ManuLock , NORDIR);
 | |
| 			CGetFile(logicname, &d, Lock, NORDIR);
 | |
| 			d.LenR = lenr ;
 | |
| 			d.EOD = k;
 | |
| 			CPutFile(logicname, &d, NORDIR);
 | |
| 			CCloseDir(NORDIR);
 | |
| 			COpenRecDir(ManuLock, NORDIR);
 | |
| 			CPutRec(logicname, newrecdes, NORDIR);
 | |
| 			CCloseRecDir(NORDIR);
 | |
| 			if ((unlink(filename) == -1) || (CRenameFil(tmpname,filename) == -1))
 | |
| 			{
 | |
| 				free(newrec);
 | |
| 				return(*err = errno);
 | |
| 			}
 | |
| #ifndef DOS
 | |
| 			else
 | |
| 				writelog(FNCHGREC, NULL, (RecType) newrecdes);
 | |
| #endif
 | |
| 		}
 | |
| 		else unlink(tmpname);
 | |
| 		free(newrec);
 | |
| 		if (vis) 
 | |
| 			progind_destroy();
 | |
| 		return(*err);
 | |
| 	}
 | |
| 
 | |
| /*
 | |
| @($) dispdata  ISAM
 | |
| 
 | |
| @(ID)
 | |
| Visualizza i dati e le informazioni relative alla fase di caricamento su file di
 | |
| testo od alla fase di scarico su file di testo.
 | |
| @(FD)
 | |
| */
 | |
| 
 | |
| void	dispdata(w,inname,outname,fs,fd,rs,vis)
 | |
| HWND				*w;        /* descrittore finestra di visualizzazione */
 | |
| char					*inname; /* nome del file di input                  */
 | |
| char					*outname;/* nome del file di output                 */
 | |
| char					fs;      /* separatore campi                        */
 | |
| char					fd;      /* delimitatore campi                      */
 | |
| char					rs;      /* delimitatore record                     */
 | |
| BOOLEAN				vis;     /* se true visualizza anche i dati         */
 | |
| 
 | |
| {
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 	if (vis)
 | |
| 	{
 | |
| 		*w = CSetWin(1, 5, 80, 17, 2, FALSE, 0, 0, ATEXT9, "");
 | |
| 		rd = 0;
 | |
| 		CCLEARWIN(*w);
 | |
| 	}
 | |
| 	CGotoXY(stdscrn, 5, 15);
 | |
| 	wprintf(stdscrn,"Input                    = %s", inname);
 | |
| 	CCLEAREOL(stdscrn) ;
 | |
| 	CGotoXY(stdscrn, 5, 16);
 | |
| 	wprintf(stdscrn,"Output                   = %s", outname);
 | |
| 	CCLEAREOL(stdscrn) ;
 | |
| 	CGotoXY(stdscrn, 5, 17);
 | |
| 	wprintf(stdscrn,"Registrazioni lette      = ");
 | |
| 	CCLEAREOL(stdscrn) ;
 | |
| 	CGotoXY(stdscrn, 5, 18);
 | |
| 	wprintf(stdscrn,"Registrazioni scritte    = ");
 | |
| 	CCLEAREOL(stdscrn) ;
 | |
| 	CGotoXY(stdscrn, 5, 19);
 | |
| 	wprintf(stdscrn,"Errori                   = ");
 | |
| 	CCLEAREOL(stdscrn) ;
 | |
| 	CGotoXY(stdscrn, 5, 20);
 | |
| 	wprintf(stdscrn,(isprint(fs) || (!fs)) ? "Separatore di campi      = %c" :
 | |
| 																	"Separatore di campi      = chr(%3d)", fs);
 | |
| 	CCLEAREOL(stdscrn) ;
 | |
| 	CGotoXY(stdscrn, 5, 21);
 | |
| 	wprintf(stdscrn,(isprint(fd) || (!fd)) ? "Delimitatore di campi    = %c" :
 | |
| 																	"Delimitatore di campi    = chr(%3d)", fd);
 | |
| 	CCLEAREOL(stdscrn) ;
 | |
| 	CGotoXY(stdscrn, 5, 22);
 | |
| 	wprintf(stdscrn,(isprint(rs) || (!rs)) ? "Delimitatore di record   = %c" :
 | |
| 																	"Delimitatore di record   = chr(%3d)", rs);
 | |
| 	crefscrn(stdscrn);
 | |
| #endif
 | |
| }
 | |
| 
 | |
| /*
 | |
| @($) getinrec  ISAM
 | |
| 
 | |
| @(ID)
 | |
| Legge un record da un file di testo.
 | |
| Ritorna il numero di caratteri che ha letto, 0 se non ha letto nulla.
 | |
| @(FD)
 | |
| 
 | |
| @(ISV)
 | |
| nread = numero di caratteri letti.
 | |
| @(FSV)
 | |
| 
 | |
| */
 | |
| 
 | |
| int	getinrec(fd,buffer,rs,vis,err)
 | |
| FILE					*fd;     /* puntatore al file                         */
 | |
| char					*buffer; /* buffer contenente i record                */
 | |
| char					rs;      /* separatore records                        */
 | |
| BOOLEAN				vis;     /* se true visualizza i dati mentre li legge */
 | |
| int						*err;    /* codice errore                             */
 | |
| 
 | |
| {
 | |
| 	int	nread = 0;
 | |
| 
 | |
| 	buffer[nread] = (uchar) fgetc(fd) ;
 | |
| 	while (!feof(fd))
 | |
| 	{
 | |
| 		if (buffer[nread] == rs) break;
 | |
| 		nread++;
 | |
| 		buffer[nread] = (uchar) fgetc(fd) ;
 | |
| 	}
 | |
| 	buffer[nread + 1] = '\0';
 | |
| 	return(nread);
 | |
| }
 | |
| 
 | |
| /*
 | |
| @($) getnextfield  ISAM
 | |
| 
 | |
| @(ID)
 | |
| Restituisce il contenuto del prossimo campo.
 | |
| Restituisce il carattere di partenza.
 | |
| @(FD)
 | |
| 
 | |
| @(ISV)
 | |
| i    = posizione corrente all' interno del buffer.
 | |
| 
 | |
| done = flag di completamento.
 | |
| 
 | |
| s    = stringa di lavoro.
 | |
| 
 | |
| s1   = stringa di lavoro.
 | |
| @(FSV)
 | |
| 
 | |
| */
 | |
| 
 | |
| char *getnextfield(isfd,buffer,cnt,len,fs,fd,rs,err)
 | |
| isfdptr				isfd;    /* descrittore del file ISAM */
 | |
| char 					*buffer; /* buffer per il record                   */
 | |
| int						*cnt;    /* carattere di partenza                  */
 | |
| int						len;     /* lunghezza del campo                    */
 | |
| char					fs;      /* separatore campi                       */
 | |
| char					fd;      /* delimitatore campi                     */
 | |
| char					rs;      /* separatore records                     */
 | |
| int						*err;    /* codice errore                          */
 | |
| 
 | |
| {
 | |
| 	int					i = *cnt;
 | |
| 	BOOLEAN			done = FALSE;
 | |
| 	char 				*s;
 | |
| 	static char	s1[256];
 | |
| 
 | |
| 	if ((fd) && (buffer[i] != fd))
 | |
| 	{
 | |
| 		*err = IsFieldErr;
 | |
| 		return(NULL);
 | |
| 	}
 | |
| 	if (fd) i++;
 | |
| 	s = buffer + i;
 | |
| 	while ((!done) && (i <= len))
 | |
| 	{
 | |
| 		if ((fd) && (buffer[i] == fd)) done = TRUE;
 | |
| 		else
 | |
| 			if ((!fd) && ((buffer[i] == fs) || (buffer[i] == rs))) done = TRUE;
 | |
| 			else i++;
 | |
| 	}
 | |
| 	if (!done)
 | |
| 	{
 | |
| 		*err = IsFieldErr;
 | |
| 		return(NULL);
 | |
| 	}
 | |
| 	buffer[i] = '\0';
 | |
| 	*cnt = i + 1;
 | |
| 	if ((fd) && (fs))
 | |
| 	{
 | |
| 		if (buffer[*cnt] == fs) (*cnt)++;
 | |
| 		else
 | |
| 			if (buffer[*cnt] != rs)
 | |
| 			{
 | |
| 				*err = IsFieldErr;
 | |
| 				return(NULL);
 | |
| 			}
 | |
| 	}
 | |
| 	strcpy(s1, s);
 | |
| 	return(s1);
 | |
| }
 | |
| 
 | |
| /*
 | |
| @($) loadrec  ISAM
 | |
| 
 | |
| @(ID)
 | |
| Carica un record nel file ISAM.
 | |
| @(FD)
 | |
| 
 | |
| @(ISV)
 | |
| j = contatore.
 | |
| 
 | |
| s = stringa di lavoro.
 | |
| @(FSV)
 | |
| */
 | |
| 
 | |
| int loadrec(isfd,buffer,rec,fs,fd,rs,len,w,vis,err)
 | |
| isfdptr				isfd;    /* descrittore del file ISAM */
 | |
| char 					*buffer; /* buffer dati del file di testo          */
 | |
| RecType				rec;     /* buffer record (output)                 */
 | |
| char					fs;      /* separatore campi                       */
 | |
| char					fd;      /* delimitatore campi                     */
 | |
| char					rs;      /* separatore record                      */
 | |
| int						len;     /* lunghezza buffer                       */
 | |
| HWND					w;       /* finestra di visualizzazione            */
 | |
| BOOLEAN				vis;     /* se true visualizza                     */
 | |
| int						*err;    /* codice errore                          */
 | |
| 
 | |
| {
 | |
| 	int				j = 0, i = 0;
 | |
| 	char 			*s;
 | |
| 
 | |
| 	*err = NoErr;
 | |
| 	while ((j < isfd->r->NFields) && (!*err))
 | |
| 	{
 | |
| 		s = getnextfield(isfd, buffer, &i, len, fs, fd, rs, err);
 | |
| 		if (!*err)
 | |
| 		{
 | |
| 			if (vis)
 | |
| 			{
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 				wprintf(w, " %-10s : %s\n", isfd->r->Fd[j].Name, (s != NULL) ? s : "");
 | |
| 				crefscrn(stdscrn);
 | |
| #endif
 | |
| 			}
 | |
| 			if (s != NULL)
 | |
| 				*err = CPutFieldBuff(isfd->r->Fd[j].Name, isfd->r, s, rec);
 | |
| 			j++;
 | |
| 		}
 | |
| 	}
 | |
| 	if ((j != isfd->r->NFields) && (!*err)) *err = IsNFieldsErr;
 | |
| 	return(*err);
 | |
| }
 | |
| 
 | |
| /*
 | |
| @(#) cloadfile  ISAM
 | |
| 
 | |
| @(ID)
 | |
| Aggiunge al file ISAM il contenuto del file di testo.
 | |
| @(FD)
 | |
| 
 | |
| @(ISV)
 | |
| wisfd = identificatore file isam.
 | |
| 
 | |
| rec   = buffer per un record isam.
 | |
| 
 | |
| buffer = buffer di input.
 | |
| 
 | |
| junk   = variabile spazzatura.
 | |
| 
 | |
| len    = lunghezza attuale del buffer di input.
 | |
| 
 | |
| w      = finestra di visualizzazione.
 | |
| 
 | |
| rl     = numero di record letti.
 | |
| 
 | |
| rt     = numero di record caricati.
 | |
| 
 | |
| er     = numero di record errati.
 | |
| 
 | |
| fin    = identificatore file di input.
 | |
| @(FSV)
 | |
| */
 | |
| 
 | |
| int	cloadfile(inname,logicname,fs,fd,rs,vis,err)
 | |
| char					*inname;   /* nome del file di testo */
 | |
| int						logicname; /* numero logico del file */
 | |
| char					fs;        /* separatore campi       */
 | |
| char					fd;        /* delimitatore campi     */
 | |
| char					rs;        /* separatore record      */
 | |
| BOOLEAN				vis;       /* se true visualizza     */
 | |
| int						*err;      /* codice di errore       */
 | |
| 
 | |
| 	{
 | |
| 		isfdptr		wisfd;
 | |
| 		RecType		rec;
 | |
| 		char 			*buffer;
 | |
| 		int				junk,len;
 | |
| 		HWND		w;
 | |
| 		RecNoType	rl = 0,rt = 0,er = 0;
 | |
| 		FILE			*fin;
 | |
| 
 | |
| 		*err = NoErr;
 | |
| 		if (cisopen(&wisfd, logicname, &rec, ExclLock, err)) return(*err);
 | |
| 		if ((fin = fopen(inname, "r")) == NULL)
 | |
| 		{
 | |
| 			*err = CIOResult();
 | |
| 			junk = cisclose(&wisfd, &rec, &junk);
 | |
| 			return(*err);
 | |
| 		}
 | |
| 		buffer = malloc(MAXTEXTLEN);
 | |
| 		dispdata(&w, inname, wisfd->d->SysName, fs, fd, rs, vis);
 | |
| 		if (rs == '\r') rs = '\n';
 | |
| 		while ((len = getinrec(fin, buffer, rs)) && (!*err))
 | |
| 		{
 | |
| 			if ((++rl % 10) == 0)
 | |
| 			{
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 				CGotoXY(stdscrn, 32, 17);
 | |
| 				wprintf(stdscrn,"%10ld", rl);
 | |
| #endif
 | |
| 			}
 | |
| 			CZeroRec(wisfd->r,rec);
 | |
| 			if (vis)
 | |
| 			{
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 				if (rd < 12) rd++;
 | |
| 				else CScroll(w, 1);
 | |
| 				CGotoXY(w, 1, rd);
 | |
| 				wprintf(w,"Registrazione N. %ld", wisfd->d->EOD + 1);
 | |
| 				CCLEAREOL(w);
 | |
| 				crefscrn(w);
 | |
| #endif
 | |
| 			}
 | |
| 			if (!loadrec(wisfd, buffer, rec, fs, fd, rs, len, w ,vis ,err))
 | |
| 			{
 | |
| 				if (ciswrite(wisfd, rec, err))
 | |
| 				{
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 					CGotoXY(stdscrn, 32, 17);
 | |
| 					wprintf(stdscrn,"%10ld", rl);
 | |
| 					CGotoXY(stdscrn, 32, 18);
 | |
| 					wprintf(stdscrn,"%10ld", rt);
 | |
| 					CGotoXY(stdscrn, 32, 19);
 | |
| 					wprintf(stdscrn,"%10ld (%d)", ++er, *err);
 | |
| 					beep();
 | |
| 					crefscrn(stdscrn);
 | |
| #endif
 | |
| 
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					rt++;
 | |
| 					if ((rl % 10) == 0)
 | |
| 					{
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 						CGotoXY(stdscrn, 32, 18);
 | |
| 						wprintf(stdscrn,"%10ld", rt);
 | |
| 						crefscrn(stdscrn);
 | |
| #endif
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 				CGotoXY(stdscrn, 32, 17);
 | |
| 				wprintf(stdscrn,"%10ld", rl);
 | |
| 				CGotoXY(stdscrn, 32, 18);
 | |
| 				wprintf(stdscrn,"%10ld", rt);
 | |
| 				CGotoXY(stdscrn, 32, 19);
 | |
| 				wprintf(stdscrn,"%10ld (%d)", ++er, *err);
 | |
| 				beep();
 | |
| 				crefscrn(stdscrn);
 | |
| 
 | |
| #endif
 | |
| 			}
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 			if ((ckeypress()) && (CReadKeyb() == Esc) && (!CInputOk(stdscrn,"Continuo")))
 | |
| 			{
 | |
| 				junk = fclose(fin);
 | |
| 				junk = cisclose(&wisfd, &rec, &junk);
 | |
| 				free(buffer);
 | |
| 				return(*err);
 | |
| 			}
 | |
| 			else *err = NoErr;
 | |
| #endif
 | |
| 		}
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 		CGotoXY(stdscrn, 32, 17);
 | |
| 		wprintf(stdscrn,"%10ld", rl);
 | |
| 		CGotoXY(stdscrn, 32, 18);
 | |
| 		wprintf(stdscrn,"%10ld", rt);
 | |
| 		crefscrn(stdscrn);
 | |
| 		if (vis) CDelWin(w);
 | |
| #endif
 | |
| 		junk = fclose(fin);
 | |
| 		junk = cisclose(&wisfd, &rec, &junk);
 | |
| 		free(buffer);
 | |
| 		return(*err);
 | |
| 	}
 | |
| 
 | |
| /*
 | |
| @($) dumprec  ISAM
 | |
| 
 | |
| @(ID)
 | |
| Scrive su di un file di testo un record del file ISAM.
 | |
| @(FD)
 | |
| 
 | |
| @(ISV)
 | |
| j = contatore.
 | |
| 
 | |
| i = contatore.
 | |
| 
 | |
| ws = stringa di lavoro.
 | |
| @(FSV)
 | |
| */
 | |
| 
 | |
| int	dumprec(isfd, rec, fout, fs, fd, rs, w, vis, err)
 | |
| isfdptr				isfd; /* decrittore del file ISAM */
 | |
| RecType				rec;  /* buffer contenente il record           */
 | |
| FILE					*fout;/* puntatore al file di testo            */
 | |
| char					fs;   /* separatore campi                      */
 | |
| char					fd;   /* delimitatore campi                    */
 | |
| char					rs;   /* separatore record                     */
 | |
| HWND				w;      /* descrittore finestra di visualizzaz.  */
 | |
| BOOLEAN				vis;  /* se true visualizza                    */
 | |
| int						*err; /* codice di errore                      */
 | |
| 
 | |
| {
 | |
| 	int		j = 0, i = 0;
 | |
| 	char ws[256];
 | |
| 
 | |
| 	*err = NoErr;
 | |
| 	while ((j < isfd->r->NFields) && (!*err))
 | |
| 	{
 | |
| 		if (!(*err = CGetFieldBuff(isfd->r->Fd[j].Name, isfd->r, rec, ws)))
 | |
| 		{
 | |
| 			if (vis)
 | |
| 			{
 | |
| 				if (rd < 12) rd++;
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 				else CScroll(w, 1);
 | |
| #endif
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 				CGotoXY(w, 1, rd);
 | |
| 				wprintf(w, " %-10s : %-s", isfd->r->Fd[j].Name, ws);
 | |
| 				CCLEAREOL(w);
 | |
| 				crefscrn(w);
 | |
| #endif
 | |
| 			}
 | |
| 			if (fd) fputc(fd, fout);
 | |
| 			fprintf(fout, "%s", ws);
 | |
| 			if (fd) fputc(fd, fout);
 | |
| 			j++;
 | |
| 			if ((fs) && (j < isfd->r->NFields)) fputc(fs, fout);
 | |
| 		}
 | |
| 	}
 | |
| 	if (rs) 
 | |
| 	{
 | |
| 		if (rs == '\r') fprintf(fout, "\n");
 | |
| 	  else fputc(rs, fout);
 | |
| 	}
 | |
| 	return(*err);
 | |
| }
 | |
| 
 | |
| /*
 | |
| @(#) cdumpfile  ISAM
 | |
| 
 | |
| @(ID)
 | |
| Scrive un file ISAM su di un file di testo.
 | |
| @(FD)
 | |
| 
 | |
| @(ISV)
 | |
| wisfd = identificatore file isam.
 | |
| 
 | |
| rec   = buffer per un record isam.
 | |
| 
 | |
| junk   = variabile spazzatura.
 | |
| 
 | |
| w      = finestra di visualizzazione.
 | |
| 
 | |
| rl     = numero di record letti.
 | |
| 
 | |
| rt     = numero di record scaricati.
 | |
| 
 | |
| er     = numero di record errati.
 | |
| 
 | |
| eod   = end of data.
 | |
| 
 | |
| fout  = identificatore file di output.
 | |
| @(FSV)
 | |
| */
 | |
| 
 | |
| int	cdumpfile(outname,logicname,knum,fs,fd,rs,vis,err)
 | |
| char					*outname; /* nome file di testo (out)     */
 | |
| int						logicname;/* numero logico file ISAM (in) */
 | |
| int						knum;     /* numero chiave per ordinare i record */
 | |
| char					fs;       /* separatore campi                    */
 | |
| char					fd;       /* delimitatore campi                  */
 | |
| char					rs;       /* separatori campi                    */
 | |
| BOOLEAN				vis;      /* se true visualizza                  */
 | |
| int						*err;     /* codice errore                       */
 | |
| 
 | |
| 	{
 | |
| 		isfdptr		wisfd;
 | |
| 		RecType		rec;
 | |
| 		int				junk;
 | |
| 		HWND		w;
 | |
| 		RecNoType	rl = 0,rt = 0,er = 0, eod;
 | |
| 		FILE			*fout;
 | |
| 
 | |
| 		*err = NoErr;
 | |
| 		if (cisopen(&wisfd, logicname, &rec, ExclLock, err)) return(*err);
 | |
| 		if ((fout = fopen(outname, "w")) == NULL)
 | |
| 		{
 | |
| 			*err = CIOResult();
 | |
| 			junk = cisclose(&wisfd, &rec, &junk);
 | |
| 			return(*err);
 | |
| 		}
 | |
| 		dispdata(&w, wisfd->d->SysName, outname, fs, fd, rs, vis);
 | |
| 		if (knum)
 | |
| 		{
 | |
| 			junk = cisstart(wisfd, knum, rec, IsFirst + NoLock, err);
 | |
| 			while (!*err)
 | |
| 			{
 | |
| 				if ((++rl % 10) == 0)
 | |
| 				{
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 					CGotoXY(stdscrn, 32, 17);
 | |
| 					wprintf(stdscrn,"%10ld", rl);
 | |
| #endif
 | |
| 				}
 | |
| 				if (vis)
 | |
| 				{
 | |
| 					if (rd < 12) rd++;
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 					else CScroll(w, 1);
 | |
| #endif
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 					CGotoXY(w, 1, rd);
 | |
| 					wprintf(w, "Registrazione N. %ld", rl);
 | |
| 					CCLEAREOL(w);
 | |
| 					crefscrn(w);
 | |
| #endif
 | |
| 				}
 | |
| 				if (dumprec(wisfd, rec, fout, fs, fd, rs, w, vis, err)) break;
 | |
| 				rt++;
 | |
| 				if ((rl % 10) == 0)
 | |
| 				{
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 					CGotoXY(stdscrn, 32, 18);
 | |
| 					wprintf(stdscrn,"%10ld", rt);
 | |
| 					crefscrn(stdscrn);
 | |
| #endif
 | |
| 				}
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 				if ((ckeypress()) && (CReadKeyb() == Esc) && (!CInputOk(stdscrn,"Continuo")))
 | |
| 				{
 | |
| 					junk = fclose(fout);
 | |
| 					junk = cisclose(&wisfd, &rec, &junk);
 | |
| 					return(*err);
 | |
| 				}
 | |
| #endif
 | |
| 				junk = cisread(wisfd, rec, IsNext + NoLock, err);
 | |
| 			}
 | |
| 			if (*err == BTrEOF) *err = NoErr;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			wisfd->RecNo = 0;
 | |
| 			eod = wisfd->d->EOD;
 | |
| 			while ((wisfd->RecNo < eod) && (!*err))
 | |
| 			{
 | |
| 				wisfd->RecNo++;
 | |
| 				CRead(&wisfd->f, rec, wisfd->RecNo, NoLock);
 | |
| 				if (!IRecIsDeleted(rec))
 | |
| 				{
 | |
| 					if ((++rl % 10) == 0)
 | |
| 					{
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 						CGotoXY(stdscrn, 32, 17);
 | |
| 						wprintf(stdscrn,"%10ld", rl);
 | |
| #endif
 | |
| 					}
 | |
| 					if (vis)
 | |
| 					{
 | |
| 						if (rd < 12) rd++;
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 						else CScroll(w, 1);
 | |
| 						CGotoXY(w, 1, rd);
 | |
| 						wprintf(w,"Registrazione N. %ld", wisfd->d->EOD + 1);
 | |
| 						CCLEAREOL(w);
 | |
| 						crefscrn(w);
 | |
| #endif
 | |
| 					}
 | |
| 					if (dumprec(wisfd, rec, fout, fs, fd, rs, w, vis, err)) break;
 | |
| 					rt++;
 | |
| 					if ((rl % 10) == 0)
 | |
| 					{
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 						CGotoXY(stdscrn, 32, 18);
 | |
| 						wprintf(stdscrn,"%10ld", rt);
 | |
| 						crefscrn(stdscrn);
 | |
| #endif
 | |
| 					}
 | |
| 				}
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 				if ((ckeypress()) && (CReadKeyb() == Esc) && (!CInputOk(stdscrn,"Continuo")))
 | |
| 				{
 | |
| 					junk = fclose(fout);
 | |
| 					junk = cisclose(&wisfd, &rec, &junk);
 | |
| 					return(*err);
 | |
| 				}
 | |
| #endif
 | |
| 			}
 | |
| 			if (*err == BTrEOF) *err = NoErr;
 | |
| 		}
 | |
| #ifdef XVT_OS
 | |
| /* implementare con xvt */
 | |
| #else
 | |
| 		CGotoXY(stdscrn, 32, 17);
 | |
| 		wprintf(stdscrn,"%10ld", rl);
 | |
| 		CGotoXY(stdscrn, 32, 18);
 | |
| 		wprintf(stdscrn,"%10ld", rt);
 | |
| 		crefscrn(stdscrn);
 | |
| 		if (vis) CDelWin(w);
 | |
| #endif
 | |
| 		junk = fclose(fout);
 | |
| 		junk = cisclose(&wisfd, &rec, &junk);
 | |
| 		return(*err);
 | |
| 	}
 |