[PyKDE] Mods to "sip" to not write modified files

Pete Ware ware at cis.ohio-state.edu
Fri May 26 23:43:18 BST 2000


I was playing around with some Qt bindings and was most miffed when an
update to one class caused the _entire_ PyQt library to be built.  I
modified gencode.c so after generating a file it checks if it is
identical to the existing one.  If it is, don't do the update.

--pete
P.S. This includes the change to va_arg(ap, int) I sent earlier

diff -u sip-0.13pre1/sip/gencode.c sip/gencode.c
*** sip-0.13pre1/sip/gencode.c	Tue May 23 13:25:05 2000
--- sip/gencode.c	Fri May 26 15:54:38 2000
***************
*** 112,118 ****
  static int countVirtuals(classVersDef *);
  static int skipOverload(overDef *,memberDef *,classVersDef *,classVersDef *,int);
  static FILE *createFile(char *,char *,char *);
! static void closeFile(FILE *);
  static void prcode(FILE *,char *,...);
  
  
--- 112,118 ----
  static int countVirtuals(classVersDef *);
  static int skipOverload(overDef *,memberDef *,classVersDef *,classVersDef *,int);
  static FILE *createFile(char *,char *,char *);
! static void closeFile(FILE *, const char *);
  static void prcode(FILE *,char *,...);
  
  
***************
*** 141,146 ****
--- 141,147 ----
  		generateCpp(pt,codeDir);
  		generatePython(pt,codeDir);
  	}
+ 	putchar ('\n');
  }
  
  
***************
*** 203,209 ****
  "}\n"
  		);
  
! 	closeFile(fp);
  	free(vfile);
  }
  
--- 204,210 ----
  "}\n"
  		);
  
! 	closeFile(fp, vfile);
  	free(vfile);
  }
  
***************
*** 254,260 ****
  "};\n"
  		);
  
! 	closeFile(fp);
  	free(hfile);
  }
  
--- 255,261 ----
  "};\n"
  		);
  
! 	closeFile(fp, hfile);
  	free(hfile);
  }
  
***************
*** 273,279 ****
  	for (cb = pt -> docs; cb != NULL; cb = cb -> next)
  		fputs(cb -> frag,fp);
  
! 	closeFile(fp);
  }
  
  
--- 274,280 ----
  	for (cb = pt -> docs; cb != NULL; cb = cb -> next)
  		fputs(cb -> frag,fp);
  
! 	closeFile(fp, docFile);
  }
  
  
***************
*** 357,363 ****
  	for (cb = pt -> makefile; cb != NULL; cb = cb -> next)
  		prcode(fp,"\n%s",cb -> frag);
  
! 	closeFile(fp);
  }
  
  
--- 358,364 ----
  	for (cb = pt -> makefile; cb != NULL; cb = cb -> next)
  		prcode(fp,"\n%s",cb -> frag);
  
! 	closeFile(fp, makeFile);
  }
  
  
***************
*** 467,473 ****
  	for (cb = pt -> pycode; cb != NULL; cb = cb -> next)
  		prcode(fp,"\n%s",cb -> frag);
  
! 	closeFile(fp);
  	free(pyfile);
  }
  
--- 468,474 ----
  	for (cb = pt -> pycode; cb != NULL; cb = cb -> next)
  		prcode(fp,"\n%s",cb -> frag);
  
! 	closeFile(fp, pyfile);
  	free(pyfile);
  }
  
***************
*** 939,945 ****
  "#endif\n"
  		);
  
! 	closeFile(fp);
  	free(hfile);
  }
  
--- 940,946 ----
  "#endif\n"
  		);
  
! 	closeFile(fp, hfile);
  	free(hfile);
  }
  
***************
*** 1309,1315 ****
  "}\n"
  		,mname);
  
! 	closeFile(fp);
  	free(cppfile);
  
  	/* Generate the class source and header files. */
--- 1310,1316 ----
  "}\n"
  		,mname);
  
! 	closeFile(fp, cppfile);
  	free(cppfile);
  
  	/* Generate the class source and header files. */
***************
*** 2004,2010 ****
  	for (cvd = cd -> cvds; cvd != NULL; cvd = cvd -> next)
  		generateClassVersCpp(cvd,pt,fp);
  
! 	closeFile(fp);
  	free(cppfile);
  }
  
--- 2005,2011 ----
  	for (cvd = cd -> cvds; cvd != NULL; cvd = cvd -> next)
  		generateClassVersCpp(cvd,pt,fp);
  
! 	closeFile(fp, cppfile);
  	free(cppfile);
  }
  
***************
*** 3902,3908 ****
  "#endif\n"
  		);
  
! 	closeFile(fp);
  	free(wfile);
  }
  
--- 3903,3909 ----
  "#endif\n"
  		);
  
! 	closeFile(fp, wfile);
  	free(wfile);
  }
  
***************
*** 5891,5901 ****
  static FILE *createFile(char *fname,char *commentStr,char *description)
  {
  	FILE *fp;
  
  	/* Create the file. */
  
! 	if ((fp = fopen(fname,"w")) == NULL)
! 		fatal("Unable to create file \"%s\"\n",fname);
  
  	currentLineNr = 1;
  	currentFileName = fname;
--- 5892,5903 ----
  static FILE *createFile(char *fname,char *commentStr,char *description)
  {
  	FILE *fp;
+ 	char *newfilename = concat (fname, ".new", NULL);
  
  	/* Create the file. */
  
! 	if ((fp = fopen(newfilename,"w+")) == NULL)
! 		fatal("Unable to create file \"%s\"\n",newfilename);
  
  	currentLineNr = 1;
  	currentFileName = fname;
***************
*** 5910,5918 ****
  
  		prcode(fp,"%s %s\n",commentStr,description);
  		prcode(fp,"%s\n",commentStr);
! 		prcode(fp,"%s Generated by SIP v%s on %s",commentStr,sipVersion,ctime(&now));
  	}
! 
  	return fp;
  }
  
--- 5912,5920 ----
  
  		prcode(fp,"%s %s\n",commentStr,description);
  		prcode(fp,"%s\n",commentStr);
! 		prcode(fp,"%s Generated by SIP v%s",commentStr,sipVersion);
  	}
! 	free (newfilename);
  	return fp;
  }
  
***************
*** 5921,5928 ****
   * Close a file and report any errors.
   */
  
! static void closeFile(FILE *fp)
  {
  	if (ferror(fp))
  		fatal("Error writing to \"%s\"\n",currentFileName);
  
--- 5923,5972 ----
   * Close a file and report any errors.
   */
  
! static void closeFile(FILE *fp, const char *fname)
  {
+ 	char *newfilename = concat ((char *) fname, ".new", NULL);
+ 	FILE	*oldfp;		/* the original file */
+ 	int	different = 0;	/* if the old and new files are different */
+ 
+ 	oldfp = fopen (fname, "r");
+ 	if (!oldfp) {
+ 		different = 2;	/* indicate file did not exist */
+ 		if (rename (newfilename, fname) < 0)
+ 			fatal ("Error renaming \"%s\" to \"%s\"\n", newfilename, fname);
+ 	}
+ 	else {
+ 		char	oldch, newch;
+ 		int	where = 0;
+ 		clearerr (fp);
+ 		if (fseek (fp, 0, SEEK_SET) < 0)
+ 			perror (newfilename);
+ 		while (!different) {
+ 			oldch = fgetc (oldfp);
+ 			newch = fgetc (fp);
+ 			if (oldch != newch) {
+ 				different = 1;
+ 				break;
+ 			}
+ 			if (oldch == EOF)
+ 				break;
+ 			where++;
+ 		}
+ 		fclose (oldfp);
+ 		if (different) {
+ 			if (rename (newfilename, fname) < 0)
+ 				fatal ("Error renaming \"%s\" to \"%s\"\n", newfilename, fname);
+ 		}
+ 	}
+ 	(void) unlink (newfilename);
+ 	free (newfilename);
+ 	if (different == 0)
+ 		putchar ('.');
+ 	else if (different == 1)
+ 		putchar ('!');
+ 	else
+ 		putchar ('+');
+ 	fflush (stdout);
  	if (ferror(fp))
  		fatal("Error writing to \"%s\"\n",currentFileName);
  
***************
*** 5951,5961 ****
  			{
  			case 'c':
  				{
! 					char c = va_arg(ap,char);
  
  					if (c == '\n')
  						++currentLineNr;
- 
  					fputc(c,fp);
  					break;
  				}
--- 5995,6004 ----
  			{
  			case 'c':
  				{
! 					char c = va_arg(ap,int);
  
  					if (c == '\n')
  						++currentLineNr;
  					fputc(c,fp);
  					break;
  				}
***************
*** 5968,5974 ****
  					{
  						if (*cp == '\n')
  							++currentLineNr;
- 
  						fputc(*cp,fp);
  						++cp;
  					}
--- 6011,6016 ----




More information about the PyQt mailing list