/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ // Registry interpreter #include #include #include #include #include "VerReg.h" #include "NSReg.h" extern char *errstr(REGERR err); extern int DumpTree(void); int gVerbose = 1; int gPretend = 0; int error(char *func, int err) { if (err == REGERR_OK) { if (gVerbose) printf("%s Ok\n", func); } else { printf("%s returns %s\n", func, errstr(err)); } return err; } // error static char *GetNextWord(char *cmd, char *buf) { // copies until ',' or eos, then skips spaces if (!cmd || !buf) return 0; while (*cmd && *cmd != ',') *buf++ = *cmd++; *buf = '\0'; if (*cmd == ',') { cmd++; while(*cmd && *cmd == ' ') cmd++; } return cmd; } // GetNextWord static int vr_ParseVersion(char *verstr, VERSION *result) { result->major = result->minor = result->release = result->build = 0; result->major = atoi(verstr); while (*verstr && *verstr != '.') verstr++; if (*verstr) { verstr++; result->minor = atoi(verstr); while (*verstr && *verstr != '.') verstr++; if (*verstr) { verstr++; result->release = atoi(verstr); while (*verstr && *verstr != '.') verstr++; if (*verstr) { verstr++; result->build = atoi(verstr); while (*verstr && *verstr != '.') verstr++; } } } return REGERR_OK; } // ParseVersion void parse(char *cmd, char *name, VERSION *ver, char *path) { // expects 'cmd' points to: ", , " char buf[256]; char *p; cmd = GetNextWord(cmd, buf); strcpy(name, buf); p = cmd; // 'cmd' points to version vr_ParseVersion(cmd, ver); ver->check = gPretend ? 0xad : 0; while (*p && *p != ',') // skip to next ',' p++; if (*p == ',') // skip comma p++; while (*p && *p == ' ') // skip white space p++; strcpy(path, p); } // parse void vVerbose(char *cmd) { if (stricmp(cmd, "ON") == 0) { gVerbose = 1; printf("Verbose mode is now ON.\n"); } else { gVerbose = 0; } } // vVerbose void vCreate(char *cmd) { // Syntax: Create [new,] 5.0b1 char buf[64]; int flag = 0; cmd = GetNextWord(cmd, buf); if (stricmp(buf, "NEW,") == 0) { flag = CR_NEWREGISTRY; } error("VR_CreateRegistry", VR_CreateRegistry(flag, cmd)); } // vCreate void vDisplay(char *cmd) { DumpTree(); } // vDisplay void vFind(char *cmd) { VERSION ver; char path[MAXREGPATHLEN]; if (error("VR_GetVersion", VR_GetVersion(cmd, &ver)) == REGERR_OK) { if (error("VR_GetPath", VR_GetPath(cmd, sizeof(path), path)) == REGERR_OK) { printf("%s found: ver=%d.%d.%d.%d, check=0x%04x, path=%s\n", cmd, ver.major, ver.minor, ver.release, ver.build, ver.check, path); return; } } printf("%s not found.\n", cmd); return; } // vFind void vHelp(char *cmd) { puts("Enter a command:"); puts("\tD)isplay - display the current contents of the Registry"); puts("\tI)nstall , , - install a new component"); puts("\tU)pdate , , - update a component"); puts("\tF)ind - returns version and path"); puts("\tV)erify - verify component exists and checks out"); puts("\tC)reate - create a new instance of Navigator (e.g., \"4.0\")"); puts("\tR)emove - deletes a component from the Registry"); puts("\tT)est - perform a simple test on the Registry"); puts("\tver(B)ose ON|off - turn verbose mode on or off"); puts("\tP)retend on|OFF - pretend that test files exist"); puts("\tS)ave - save the Registry to disk"); puts("\tpac(K) registry - squeeze out unused space from the Registry"); puts("\tQ)uit - end the program"); } // vHelp void vInstall(char *cmd) { char name[MAXREGPATHLEN+1]; char path[MAXREGPATHLEN+1]; VERSION ver; parse(cmd, name, &ver, path); error("VR_Install", VR_Install(name, path, &ver)); } // vInstall void vPack(char *cmd) { error("VR_PackRegistry", VR_PackRegistry(0)); } // vPack void vPretend(char *cmd) { if (!cmd) { gPretend = !!gPretend; } else { if (stricmp(cmd, "ON") == 0) gPretend = 1; else gPretend = 0; } if (gVerbose) printf("Pretend mode is %s\n", gPretend ? "ON" : "OFF"); } // vPretend void vRemove(char *cmd) { error("VR_Remove", VR_Remove(cmd)); } // vRemove void vSave(char *cmd) { error("VR_Checkpoint", VR_Checkpoint()); } // vSave void vTest(char *cmd) { VERSION ver; ver.major = 4; ver.minor = 0; ver.release = 0; ver.build = 237; ver.check = gPretend ? 0xad : 0; if (error("VR_Install", VR_Install("Navigator/NS.exe", "c:\\Program Files\\Netscape\\Navigator\\Program\\NETSCAPE.EXE", &ver))) return; if (error("VR_Install", VR_Install("Navigator/Help", "c:\\Program Files\\Netscape\\Navigator\\Program\\NETSCAPE.HLP", &ver))) return; if (error("VR_Install", VR_Install("Navigator/NSPR", "c:\\Program Files\\Netscape\\Navigator\\Program\\NSPR32.DLL", &ver))) return; if (error("VR_Install", VR_Install("Navigator/Player", "c:\\Program Files\\Netscape\\Navigator\\Program\\NSPLAYER.EXE", &ver))) return; if (error("VR_Install", VR_Install("Navigator/NSJava", "c:\\Program Files\\Netscape\\Navigator\\Program\\NSJAVA32.DLL", &ver))) return; if (error("VR_Install", VR_Install("Web/Certificate.DB", "c:\\Program Files\\Netscape\\Navigator\\Program\\CERT.DB", &ver))) return; if (error("VR_Install", VR_Install("Web/CertificateNI.DB", "c:\\Program Files\\Netscape\\Navigator\\Program\\CERTNI.DB", &ver))) return; if (error("VR_Install", VR_Install("Web/Keys", "c:\\Program Files\\Netscape\\Navigator\\Program\\KEY.DB", &ver))) return; if (error("VR_Install", VR_Install("MailNews/Postal", "c:\\Program Files\\Netscape\\Navigator\\System\\POSTAL32.DLL", &ver))) return; if (error("VR_Install", VR_Install("MailNews/Folders/Inbox", "c:\\Program Files\\Netscape\\Navigator\\Mail\\INBOX.SNM", &ver))) return; if (error("VR_Install", VR_Install("MailNews/Folders/Sent", "c:\\Program Files\\Netscape\\Navigator\\Mail\\SENT.SNM", &ver))) return; if (error("VR_Install", VR_Install("MailNews/Folders/Trash", "c:\\Program Files\\Netscape\\Navigator\\Mail\\TRASH.SNM", &ver))) return; if (error("VR_Install", VR_Install("Components/NUL", "c:\\Program Files\\Netscape\\Navigator\\Program\\Plugins\\NPNUL32.DLL", &ver))) return; if (error("VR_Install", VR_Install("Components/PointCast", "c:\\Program Files\\Netscape\\Navigator\\Program\\Plugins\\NPPCN32.DLL", &ver))) return; if (error("VR_Install", VR_Install("Components/AWT", "c:\\Program Files\\Netscape\\Navigator\\Program\\Java\\bin\\AWT3220.DLL", &ver))) return; if (error("VR_Install", VR_Install("Components/MM", "c:\\Program Files\\Netscape\\Navigator\\Program\\Java\\bin\\MM3220.DLL", &ver))) return; if (error("VR_Install", VR_Install("Java/Classes.Zip", "c:\\Program Files\\Netscape\\Navigator\\Program\\Java\\classes\\MOZ2_0.ZIP", &ver))) return; if (error("VR_Install", VR_Install("Java/Classes Directory", "c:\\Program Files\\Netscape\\Navigator\\Program\\Java\\classes\\MOZ2_0", &ver))) return; } // vTest void vUpdate(char *cmd) { char name[MAXREGPATHLEN+1]; char path[MAXREGPATHLEN+1]; VERSION ver; parse(cmd, name, &ver, path); error("VR_Update", VR_Update(name, path, &ver)); } // vUpdate void vVerify(char *cmd) { error("VR_CheckEntry", VR_CheckEntry(0, cmd)); } // vVerify void interp(void) { char line[256]; char *p; while(1) { putchar('>'); putchar(' '); flushall(); gets(line); // p points to next word after verb on command line p = line; while (*p && *p!=' ') p++; if (!*p) p = 0; else { while(*p && *p==' ') p++; } switch(toupper(line[0])) { case 'B': vVerbose(p); break; case 'C': vCreate(p); break; case 'D': vDisplay(p); break; case 'F': vFind(p); break; case 'H': default: vHelp(line); break; case 'I': vInstall(p); break; case 'K': vPack(p); break; case 'P': vPretend(p); break; case 'R': vRemove(p); break; case 'S': vSave(p); break; case 'T': vTest(p); break; case 'U': vUpdate(p); break; case 'V': vVerify(p); break; case 'Q': case 'X': vSave(0); return; } // switch } // while assert(0); return; // shouldn't get here } // interp // EOF: interp.c