/*
 * This little piece of code should make life easier for customizing ScrollZ.
 *
 * Be sure to follow next steps, otherwise things won't work !!!
 * First of all, run configure. Next, compile this program and put it in
 * main ScrollZ dir (this *IS* important).
 * It needs include/defs.h and include/defs.h.in to operate plus working rm
 * (yes, the UN*X command).
 *
 * Once you qualify for requirements, you're ready to use it. Just run it and
 * you'll be present with current ScrollZ setup (read from include/defs.h).
 * Follow on-screen instructions and make your choices. Either use 'Q' to quit
 * or press 'W' to save. If you opted for latter, just type make irc and in a
 * matter of minutes you will have binary of your choice.
 *
 * Now that ScrollZ has a lot of compile-time options, we needed this so one
 * can simply feed this program output of /eval echo $J and get bin with
 * exactly the same options.
 *
 * Note that this should reduce compile time too since it only recompiles
 * files that are affected by selected options. If you need more info or you
 * have comments on this code, send e-mail to:
 * flier@scrollz.com
 * 
 * $Id: SZdist.c,v 1.42 2004/08/13 18:35:37 f Exp $
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <time.h>
#include <unistd.h>
#include <utime.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>

#define WANTANSI       (1<<0)
#define EXTRAS         (1<<1)
#define GENX           (1<<2)
#define NEWCSCAN       (1<<3)
#define ACID           (1<<4)
#define SORTEDNICKS    (1<<5)
#define SCKICKS        (1<<6)
#define OPERVISION     (1<<7)
#define CELE           (1<<8)
#define VILAS          (1<<9)
#define JIMMIE         (1<<10)
#define CTCPPAGE       (1<<11)
#define TDF            (1<<12)
#define COUNTRY        (1<<13)
#define OPER           (1<<14)
#define OGRE           (1<<15)
#define SZ32           (1<<16)
#define LITE           (1<<17)
#define ALTPUBLICS     (1<<18)
#define MIRCRESUME     (1<<19)
#define NUMDEFS        (MIRCRESUME)

#define mybufsize 1024

char *defsfile="include/defs.h";
char *defsoldfile="include/defs.h.old";

char *WANTANSIfiles="alias.o cdcc.o dcc.o edit.o edit2.o edit3.o edit4.o edit5.o\
 edit6.o input.o log.o names.o numbers.o parse.o screen.o status.o term.o vars.o\
 whois.o";
char *EXTRASfiles="alias.o cdcc.o edit.o edit2.o edit3.o edit4.o edit5.o edit6.o\
 list.o names.o numbers.o parse.o whowas.o";
char *GENXfiles="edit5.o whois.o";
char *NEWCSCANfiles="edit2.o";
char *ACIDfiles="edit.o edit2.o edit3.o edit5.o edit6.o screen.o vars.o window.o";
char *SORTEDNICKSfiles="edit5.o names.o";
char *SCKICKSfiles="edit.o edit3.o edit4.o";
char *OPERVISIONfiles="edit.o edit3.o edit5.o funny.o notice.o operv.o parse.o\
 window.o";
char *CELEfiles="alias.o cdcc.o celerity.o edit.o edit2.o edit3.o edit4.o edit5.o\
 edit6.o input.o numbers.o operv.o parse.o server.o status.o vars.o whois.o";
char *VILASfiles="edit2.o edit6.o";
char *JIMMIEfiles="edit2.o";
char *CTCPPAGEfiles="ctcp.o";
char *TDFfiles="cdcc.o dcc.o edit.o edit4.o edit5.o edit6.o status.o";
char *COUNTRYfiles="alias.o";
char *SZ32files="*.o";
char *OPERfiles="edit.o edit2.o edit3.o edit5.o edit6.o numbers.o parse.o";
char *OGREfiles="operv.o";
char *LITEfiles="*.o";
char *ALTPUBLICSfiles="edit5.o";
char *MIRCRESUMEfiles="cdcc.o dcc.o";

char format[mybufsize];

char *onoffstr(type,onoffbuf)
int type;
char *onoffbuf;
{
    strcpy(onoffbuf,"");
    if (type) strcat(onoffbuf,"ON ");
    else strcat(onoffbuf,"OFF");
    strcat(onoffbuf,"");
    return(onoffbuf);
}

void addtobuf(files,buffer,choice,oldchoice,what)
char *files;
char *buffer;
int  choice;
int  oldchoice;
int  what;
{
    char buf[32];
    char tmpbuf[mybufsize];
    char filebuf[64];
    char *tmpstr1=tmpbuf;
    char *tmpstr2;

    if ((choice&what)==(oldchoice&what)) return;
    strcpy(tmpbuf,files);
    tmpstr2=strtok(tmpstr1," ");
    do {
        sprintf(filebuf," %s",tmpstr2);
        if (!strstr(buffer,filebuf)) {
            if (strstr(tmpstr2,".c")) {
                printf("Not deleting %s, because it is .c file !!\n",tmpstr2);
                getchar();
            }
            else {
                sprintf(buf," source/%s",tmpstr2);
                strcat(buffer,buf);
            }
        }
    } while ((tmpstr2=strtok(NULL," ")));
}

void touchfile(file,statbuf)
char *file;
struct stat *statbuf;
{
    struct utimbuf utimbuf;

    utimbuf.actime=statbuf->st_atime;
    utimbuf.modtime=statbuf->st_mtime;
    if ((utime(file,&utimbuf))!=0)
        printf("Error, couldn't set time on file %s\n",file);
}

int main(argc,argv)
int argc;
char **argv;
{
    int  i,choice=0,oldchoice=0;
    int  end=0;
    char c;
    char tmpbuf[2*mybufsize];
    char onoffbuf[32];
    char buf[mybufsize];
    char *tmp1;
    FILE *fpin=NULL,*fpout;
    struct stat statbuf;

    if ((fpin=fopen(defsfile,"r"))==NULL || stat(defsfile,&statbuf)!=0) {
        printf("Error, couldn't open %s for reading\n",defsfile);
        if (fpin) fclose(fpin);
        return(1);
    }
    while (fgets(buf,1024,fpin))
        if (strstr(buf,"#define")) {
            if (strstr(buf,"WANTANSI")) choice|=WANTANSI;
            else if (strstr(buf,"EXTRAS")) choice|=EXTRAS;
            else if (strstr(buf,"GENX")) choice|=GENX;
            else if (strstr(buf,"NEWCSCAN")) choice|=NEWCSCAN;
            else if (strstr(buf,"ACID")) choice|=ACID;
            else if (strstr(buf,"SORTED_NICKS")) choice|=SORTEDNICKS;
            else if (strstr(buf,"SCKICKS")) choice|=SCKICKS;
            else if (strstr(buf,"OPERVISION")) choice|=OPERVISION;
	    else if (strstr(buf,"CELE")) choice|=CELE;
	    else if (strstr(buf,"VILAS")) choice|=VILAS;
	    else if (strstr(buf,"JIMMIE")) choice|=JIMMIE;
	    else if (strstr(buf,"CTCPPAGE")) choice|=CTCPPAGE;
	    else if (strstr(buf,"TDF")) choice|=TDF;
	    else if (strstr(buf,"COUNTRY")) choice|=COUNTRY;
	    else if (strstr(buf,"SZ32")) choice|=SZ32;
	    else if (strstr(buf,"OPER")) choice|=OPER;
	    else if (strstr(buf,"OGRE")) choice|=OGRE;
	    else if (strstr(buf,"LITE")) choice|=LITE;
	    else if (strstr(buf,"ALTERNATIVE_PUBLICS")) choice|=ALTPUBLICS;
	    else if (strstr(buf,"BROKEN_MIRC_RESUME")) choice|=MIRCRESUME;
        }
    fclose(fpin);
    oldchoice=choice;
    if (argc==2) {
        for (tmp1=argv[1];*tmp1 && *tmp1!=' ';tmp1++) {
            if (*tmp1=='A') choice|=WANTANSI;
            else if (*tmp1=='a') choice&=~WANTANSI;
            if (*tmp1=='E') choice|=EXTRAS;
            else if (*tmp1=='e') choice&=~EXTRAS;
            if (*tmp1=='C') choice|=NEWCSCAN;
            else if (*tmp1=='c') choice&=~NEWCSCAN;
            if (*tmp1=='S') choice|=SCKICKS;
            else if (*tmp1=='s') choice&=~SCKICKS;
            if (*tmp1=='P') choice|=CTCPPAGE;
            else if (*tmp1=='p') choice&=~CTCPPAGE;
            if (*tmp1=='Y') choice|=COUNTRY;
            else if (*tmp1=='y') choice&=~COUNTRY;
            if (*tmp1=='L') choice|=LITE;
            else if (*tmp1=='l') choice&=~LITE;
            if (*tmp1=='N') choice|=SORTEDNICKS;
            else if (*tmp1=='n') choice&=~SORTEDNICKS;
            if (*tmp1=='U') choice|=ALTPUBLICS;
            else if (*tmp1=='u') choice&=~ALTPUBLICS;
            if (*tmp1=='M') choice|=MIRCRESUME;
            else if (*tmp1=='m') choice&=~MIRCRESUME;
        }
        if (*tmp1==' ' && *(tmp1+1)=='O' && *(tmp1+2)=='V') {
            choice|=OPERVISION;
            tmp1++;
            tmp1++;
            tmp1++;
        }
        else choice&=~OPERVISION;
        if (*tmp1==' ' && *(tmp1+1)=='c' && *(tmp1+2)=='y') {
            choice|=CELE;
            tmp1++;
            tmp1++;
            tmp1++;
        }
        else choice&=~CELE;
        if (*tmp1==' ') {
            tmp1++;
            for (;*tmp1 && *tmp1!=' ';tmp1++) {
                if (*tmp1=='G') choice|=GENX;
                else if (*tmp1=='g') choice&=~GENX;
                if (*tmp1=='I') choice|=ACID;
                else if (*tmp1=='i') choice&=~ACID;
                if (*tmp1=='V') choice|=VILAS;
                else if (*tmp1=='v') choice&=~VILAS;
                if (*tmp1=='J') choice|=JIMMIE;
                else if (*tmp1=='j') choice&=~JIMMIE;
                if (*tmp1=='X') choice|=TDF;
                else if (*tmp1=='x') choice&=~TDF;
                if (*tmp1=='Z') choice|=OGRE;
                else if (*tmp1=='z') choice&=~OGRE;
            }
        }
        if (*tmp1==' ' && *(tmp1+1)=='O' && *(tmp1+2)=='P' && *(tmp1+3)=='E' &&
                          *(tmp1+4)=='R') {
            choice|=OPER;
            tmp1++;
            tmp1++;
            tmp1++;
        }
        else choice&=~OPER;
    }
    strcpy(tmpbuf,"rm source/irc.o source/ctcp.o");
    do {
        printf("");
        printf("Enter letter to toggle option on/off, 'Q' to quit, 'W' to save and quit\n");
        printf("-------------------------------------------------------------------------------\n");
        printf(" A - WANTANSI      %s - color capable client\n",
               onoffstr(choice&WANTANSI,onoffbuf));
        printf(" B - EXTRAS        %s - enables commands like AUTOINV, BKT, DIRLMK...\n",
               onoffstr(choice&EXTRAS,onoffbuf));
        printf(" D - GENX          %s - GenX's nifty WHOIS, req. WANTANSI\n",
               onoffstr(choice&GENX,onoffbuf));
        printf(" E - NEWCSCAN      %s - formatted CSCAN, similar to BitchX\n",
               onoffstr(choice&NEWCSCAN,onoffbuf));
        printf(" F - ACID          %s - invite on notify for non +i channels, req. EXTRAS\n",
               onoffstr(choice&ACID,onoffbuf));
        printf(" G - SORTEDNICKS   %s - sorted nicks in CSCAN\n",
               onoffstr(choice&SORTEDNICKS,onoffbuf));
        printf(" H - SCKICKS       %s - scatter (funny) kicks\n",
               onoffstr(choice&SCKICKS,onoffbuf));
        printf(" I - OPERVISION    %s - for IRC Operators, req. WANTANSI\n",
               onoffstr(choice&OPERVISION,onoffbuf));
	printf(" J - CELE          %s - Compile with Celerity C-script\n",
	       onoffstr(choice&CELE,onoffbuf));
	printf(" L - VILAS         %s - No ScrollZ trademarks in ctcps\n",
	       onoffstr(choice&VILAS,onoffbuf));
	printf(" M - JIMMIE        %s - Better NEWHOST (lists all hostnames)\n",
	       onoffstr(choice&JIMMIE,onoffbuf));
	printf(" N - CTCP PAGE     %s - CTCP PAGE for friends by BiGhEaD\n",
	       onoffstr(choice&CTCPPAGE,onoffbuf));
	printf(" O - TDF           %s - different msgs, chat msgs and CDCC\n",
	       onoffstr(choice&TDF,onoffbuf));
	printf(" P - COUNTRY       %s - compile with $country()\n",
	       onoffstr(choice&COUNTRY,onoffbuf));
	printf(" R - ALTPUBLICS    %s - () around nick in public messages\n",
	       onoffstr(choice&ALTPUBLICS,onoffbuf));
	printf(" S - LITE          %s - compile without some functionality\n",
	       onoffstr(choice&LITE,onoffbuf));
	printf(" 3 - SZ32          %s - compile for Win32 (NT+95)\n",
	       onoffstr(choice&SZ32,onoffbuf));
	printf(" Y - OPER          %s - compile with IRC oper stuff\n",
	       onoffstr(choice&OPER,onoffbuf));
	printf(" Z - OGRE          %s - compile with ogre's OperVision cosmetics\n",
	       onoffstr(choice&OGRE,onoffbuf));
	printf(" T - MIRCRESUME    %s - enable support for broken mIRC DCC resume\n",
	       onoffstr(choice&MIRCRESUME,onoffbuf));
        printf(" Q - QUIT          W - SAVE & QUIT\n");
        printf("Enter your choice: ");
        c=getchar();
        if (c>='a' && c<='z') c-=32;
        if (c=='Q') end=1;
        else if (c=='W') end=2;
        else {
            switch (c) {
                case 'A': if ((choice&WANTANSI)) choice&=~WANTANSI;
                          else choice|=WANTANSI;
                          break;
                case 'B': if ((choice&EXTRAS)) choice&=~EXTRAS;
                          else choice|=EXTRAS;
                          break;
                case 'D': if ((choice&GENX)) choice&=~GENX;
                          else choice|=GENX;
                          break;
                case 'E': if ((choice&NEWCSCAN)) choice&=~NEWCSCAN;
                          else choice|=NEWCSCAN;
                          break;
                case 'F': if ((choice&ACID)) choice&=~ACID;
                          else choice|=ACID;
                          break;
                case 'G': if ((choice&SORTEDNICKS)) choice&=~SORTEDNICKS;
                          else choice|=SORTEDNICKS;
                          break;
                case 'H': if ((choice&SCKICKS)) choice&=~SCKICKS;
                          else choice|=SCKICKS;
                          break;
                case 'I': if ((choice&OPERVISION)) choice&=~OPERVISION;
                          else choice|=OPERVISION;
                          break;
		case 'J': if ((choice&CELE)) choice&=~CELE;
			  else choice|=CELE;
			  break;
		case 'L': if ((choice&VILAS)) choice&=~VILAS;
			  else choice|=VILAS;
			  break;
		case 'M': if ((choice&JIMMIE)) choice&=~JIMMIE;
			  else choice|=JIMMIE;
			  break;
		case 'N': if ((choice&CTCPPAGE)) choice&=~CTCPPAGE;
			  else choice|=CTCPPAGE;
			  break;
		case 'O': if ((choice&TDF)) choice&=~TDF;
			  else choice|=TDF;
			  break;
		case 'P': if ((choice&COUNTRY)) choice&=~COUNTRY;
			  else choice|=COUNTRY;
			  break;
		case 'S': if ((choice&LITE)) choice&=~LITE;
			  else choice|=LITE;
			  break;
		case 'R': if ((choice&ALTPUBLICS)) choice&=~ALTPUBLICS;
			  else choice|=ALTPUBLICS;
			  break;
		case '3': if ((choice&SZ32)) choice&=~SZ32;
			  else choice|=SZ32;
			  break;
		case 'Y': if ((choice&OPER)) choice&=~OPER;
			  else choice|=OPER;
			  break;
		case 'Z': if ((choice&OGRE)) choice&=~OGRE;
			  else choice|=OGRE;
			  break;
		case 'T': if ((choice&MIRCRESUME)) choice&=~MIRCRESUME;
			  else choice|=MIRCRESUME;
			  break;
            }
        }
        if (!(choice&WANTANSI)) choice&=~OPERVISION;
        if (!(choice&WANTANSI)) choice&=~GENX;
        if (!(choice&WANTANSI)) choice&=~TDF;
        if (!(choice&EXTRAS)) choice&=~ACID;
        if (!(choice&OPERVISION)) choice&=~OGRE;
    } while (!end);
    if (end==2) {
        for (i=1;i<=NUMDEFS;i*=2) {
            if (i==WANTANSI) addtobuf(WANTANSIfiles,tmpbuf,choice,oldchoice,i);
            else if (i==EXTRAS) addtobuf(EXTRASfiles,tmpbuf,choice,oldchoice,i);
            else if (i==GENX) addtobuf(GENXfiles,tmpbuf,choice,oldchoice,i);
            else if (i==NEWCSCAN) addtobuf(NEWCSCANfiles,tmpbuf,choice,oldchoice,i);
            else if (i==ACID) addtobuf(ACIDfiles,tmpbuf,choice,oldchoice,i);
            else if (i==SORTEDNICKS) addtobuf(SORTEDNICKSfiles,tmpbuf,choice,oldchoice,i);
            else if (i==SCKICKS) addtobuf(SCKICKSfiles,tmpbuf,choice,oldchoice,i);
            else if (i==OPERVISION) addtobuf(OPERVISIONfiles,tmpbuf,choice,oldchoice,i);
	    else if (i==CELE) addtobuf(CELEfiles,tmpbuf,choice,oldchoice,i);
	    else if (i==VILAS) addtobuf(VILASfiles,tmpbuf,choice,oldchoice,i);
	    else if (i==JIMMIE) addtobuf(JIMMIEfiles,tmpbuf,choice,oldchoice,i);
	    else if (i==CTCPPAGE) addtobuf(CTCPPAGEfiles,tmpbuf,choice,oldchoice,i);
	    else if (i==TDF) addtobuf(TDFfiles,tmpbuf,choice,oldchoice,i);
	    else if (i==COUNTRY) addtobuf(COUNTRYfiles,tmpbuf,choice,oldchoice,i);
	    else if (i==SZ32) addtobuf(SZ32files,tmpbuf,choice,oldchoice,i);
	    else if (i==OPER) addtobuf(OPERfiles,tmpbuf,choice,oldchoice,i);
	    else if (i==OGRE) addtobuf(OGREfiles,tmpbuf,choice,oldchoice,i);
	    else if (i==LITE) addtobuf(LITEfiles,tmpbuf,choice,oldchoice,i);
	    else if (i==ALTPUBLICS) addtobuf(ALTPUBLICSfiles,tmpbuf,choice,oldchoice,i);
	    else if (i==MIRCRESUME) addtobuf(MIRCRESUMEfiles,tmpbuf,choice,oldchoice,i);
        }
        if (rename(defsfile,defsoldfile)<0) {
            printf("Error, couldn't rename %s to %s\n",defsfile,defsoldfile);
            return(1);
        }
        if ((fpin=fopen(defsoldfile,"r"))==NULL) {
            printf("Error, couldn't open %s for reading\n",defsoldfile);
            return(1);
        }
        if ((fpout=fopen(defsfile,"w"))==NULL) {
            printf("Error, couldn't open %s for writing\n",defsfile);
            fclose(fpin);
            return(1);
        }
        while (fgets(buf,1024,fpin)) {
            int len=strlen(buf);

            while (len>0 && (buf[len-1]=='\n' || buf[len-1]=='\r')) {
                buf[len-1]='\0';
                len--;
            }
            if (!strcmp(buf,"/* Define this if you want client with ANSI (color) support */"))
                break;
            fprintf(fpout,"%s\n",buf);
        }
        fprintf(fpout,"/* Define this if you want client with ANSI (color) support */\n");
        if (choice&WANTANSI) fprintf(fpout,"#define WANTANSI\n");
        else fprintf(fpout,"#undef WANTANSI\n");
        fprintf(fpout,"\n/* Define this if you want OperVision support in the client */\n");
        if (choice&OPERVISION) fprintf(fpout,"#define OPERVISION\n");
        else fprintf(fpout,"#undef OPERVISION\n");
        fprintf(fpout,"\n/* Define this if you want following optional stuff:\n");
        fprintf(fpout," - /AUTOINV\n");
        fprintf(fpout," - /BKT       - /BKI         - /CHSIGNOFF\n");
        fprintf(fpout," - /DIRLMK    - /DIRLNK      - /DOBANS\n");
        fprintf(fpout," - /IDLEKICK  - /IDLETIME    - /LLOOK\n");
        fprintf(fpout," - /LLOOKUP   - /MASSDV      - /MASSV\n");
        fprintf(fpout," - /MODELOCK  - /MODEUNLOCK  - /MSAY\n");
        fprintf(fpout," - /RANLK     - /SHOWIDLE */\n");
        if (choice&EXTRAS) fprintf(fpout,"#define EXTRAS\n");
        else fprintf(fpout,"#undef EXTRAS\n");
        fprintf(fpout,"\n/* Defines this if you want GenX's nifty /WHOIS */\n");
        if (choice&GENX) fprintf(fpout,"#define GENX\n");
        else fprintf(fpout,"#undef GENX\n");
        fprintf(fpout,"\n/* Define this if you want formatted /CSCAN */\n");
        if (choice&NEWCSCAN) fprintf(fpout,"#define NEWCSCAN\n");
        else fprintf(fpout,"#undef NEWCSCAN\n");
        fprintf(fpout,"\n/* Define this if you want () around nick in public messages */\n");
        if (choice&ALTPUBLICS) fprintf(fpout,"#define ALTERNATIVE_PUBLICS\n");
        else fprintf(fpout,"#undef ALTERNATIVE_PUBLICS\n");
        fprintf(fpout,"\n/* Define this if you feel users should be invited to non +i channels on\n");
        fprintf(fpout,"   notify signon and +z userflag */\n");
        if (choice&ACID) fprintf(fpout,"#define ACID\n");
        else fprintf(fpout,"#undef ACID\n");
        fprintf(fpout,"\n/* Define this if you want sorted nicks in /CSCAN */\n");
        if (choice&SORTEDNICKS) fprintf(fpout,"#define SORTED_NICKS\n");
        else fprintf(fpout,"#undef SORTED_NICKS\n");
        fprintf(fpout,"\n/* Define this if you want scatter (funny) kicks support */\n");
        if (choice&SCKICKS) fprintf(fpout,"#define SCKICKS\n");
        else fprintf(fpout,"#undef SCKICKS\n");
	fprintf(fpout,"\n/* Define this if you want to compile with Celerity C-Script */\n");
	if (choice&CELE) fprintf(fpout,"#define CELE\n");
	else fprintf(fpout,"#undef CELE\n");
        fprintf(fpout,"#include \"celerity.h\"\n");
	fprintf(fpout,"\n/* Define this if you don't want ScrollZ trademarks in CTCPs */\n");
	if (choice&VILAS) fprintf(fpout,"#define VILAS\n");
	else fprintf(fpout,"#undef VILAS\n");
	fprintf(fpout,"\n/* Define this if you want better /NEWHOST */\n");
	if (choice&JIMMIE) fprintf(fpout,"#define JIMMIE\n");
	else fprintf(fpout,"#undef JIMMIE\n");
	fprintf(fpout,"\n/* Define this if you want CTCP PAGE by bighead */\n");
	if (choice&CTCPPAGE) fprintf(fpout,"#define CTCPPAGE\n");
	else fprintf(fpout,"#undef CTCPPAGE\n");
	fprintf(fpout,"\n/* Define this if you want different look of messages and DCC chat messages */\n");
	if (choice&TDF) fprintf(fpout,"#define TDF\n");
	else fprintf(fpout,"#undef TDF\n");
        fprintf(fpout,"\n/* Define this if you want $country() in the client */\n");
	if (choice&COUNTRY) fprintf(fpout,"#define COUNTRY\n");
	else fprintf(fpout,"#undef COUNTRY\n");
        fprintf(fpout,"\n/* Define this if you want client with Win32 support */\n");
	if (choice&SZ32) fprintf(fpout,"#define SZ32\n");
	else fprintf(fpout,"#undef SZ32\n");
        fprintf(fpout,"\n/* Define this if you want irc oper stuff (not OperVision!) */\n");
	if (choice&OPER) fprintf(fpout,"#define OPER\n");
	else fprintf(fpout,"#undef OPER\n");
        fprintf(fpout,"\n/* Define this if you want ogre's cosmetics in OperVision */\n");
	if (choice&OGRE) fprintf(fpout,"#define OGRE\n");
	else fprintf(fpout,"#undef OGRE\n");
        fprintf(fpout,"\n/* Define this if you want client w/o certain functionality */\n");
	if (choice&LITE) fprintf(fpout,"#define LITE\n");
	else fprintf(fpout,"#undef LITE\n");
        fprintf(fpout,"\n/* Define this if you want mIRC compatible DCC resume */\n");
	if (choice&MIRCRESUME) fprintf(fpout,"#define BROKEN_MIRC_RESUME\n");
	else fprintf(fpout,"#undef BROKEN_MIRC_RESUME\n");
        fprintf(fpout,"/****************************************************************************/\n");
        fclose(fpin);
        fclose(fpout);
        if (strcmp(tmpbuf,"rm")) {
            strcat(tmpbuf," >/dev/null 2>&1");
            system(tmpbuf);
        }
        touchfile(defsfile,&statbuf);
    }
    return(0);
}


syntax highlighted by Code2HTML, v. 0.9.1