Thanks. I will attend to most of this. A couple of points:


. using "wb" for writing out on Windows is so that we don't get Windows' gratuitous addition of carriage returns. I will document that.
. I can't use do { stuff; } while(0) for a macro that does declarations - the declarations would be local to the do block.


Doesn't pg_indent do the spacing for us when code is merged? I guess I can get BSD indent - my Linux box only has GNU indent. If indent won't do spacing I'll go through and do it by hand.

Expect a new version in a few days - with the removal of the initdb-scripts.h as well as these changes.

cheers

andrew




Peter Eisentraut wrote:


Andrew Dunstan writes:



New version has passed basic Windows tests, and is available (with new
Makefile too) at http://www.dunslane.net/~andrew/Initdb_In_C.html

constructive comments (very) welcome.



That looks very nice. Just some nitpicking comments. (Most of these comments should be extrapolated to similar source code fragments.)




#include <getopt_long.h>



Must be "getopt_long.h" because it might be our own replacement file.




#include <sys/types.h>



Already done in c.h.




/* who we are */
#define PG_VERSIONSTR "postgres (PostgreSQL) " PG_VERSION "\n"



Should be "initdb (PostgreSQL) ...".




#define WRITEMODE "wb"



Use #define PG_BINARY_W "wb", if you are writing "binary" files, which isn't quite clear.



/*
* macros for running pipes to postgres
* note lack of trailing ';' must be placed there when macros are used.
* this keeps emacs indentation happy
*/

#define PG_CMD_DECL char cmd[MAXPGPATH]; char ** line ; FILE * pg



Use


#define MACRO do { code; here; } while(0)

That's the standard mechanism.



#endif



Write "#endif /* WIN32 */", or whatever the case may be.




#define malloc(x) xmalloc( (x) )



You are not allowed to redefine or otherwise fiddle with standard library functions. Just write xmalloc when you mean xmalloc.



if (strcmp(file->d_name,".") && strcmp(file->d_name,".."))



Please compare the result of strcmp() with 0. Code like this makes my brain hurt. Do

#define streq(a, b) (strcmp((a), (b))==0)

if you must.



snprintf(filepath,MAXPGPATH,"%s/%s",path,*filename);



Spaces after the commas. Spaces after semicolons. Spaces before and after binary operators. More spaces everywhere.



static char *
pg_getlocale(char * arg)



This is redundant. In C you can just use, for example,


locale = setlocale(LC_CTYPE, NULL);

This is actually one of the nice things we'll get out of having this in C.



sizeof(char)



... is always 1.




newtext = replace_token(usage_text,"$CMDNAME",progname);

for (i=0; newtext[i]; i++)
fputs(newtext[i],stdout);



Uh, why not use printf directly?




if (show_version)
{
printf("%s (PostgreSQL) %s\n",argv[0],PG_VERSION);
exit(0);
}



For the --version output, the program name is always hardcoded, to allow identification in case the program was renamed.



if (!mkdatadir(NULL))
{
exit_nicely();
}
else
check_ok();



Bizarre use of braces.






---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

Reply via email to