blob: 59f4498d3f6c89ec3d9ecab91e9c76cb72e359c5 [file] [log] [blame]
/*
* R : A Computer Language for Statistical Data Analysis
* Copyright (C) 2001-10 R Core Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, a copy is available at
* https://www.R-project.org/Licenses/
*/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h> /* for exit */
#include <Rversion.h>
#define PRODUCER "R-core"
#ifdef _WIN64
# define RK "R64"
#else
# define RK "R32"
#endif
extern char *getRHOMElong(int m); /* in ../rhome.c */
int main (int argc, char **argv)
{
HKEY hk = HKEY_LOCAL_MACHINE;
DWORD subkeys = 0;
char *RHome, version[40], keyname[60];
LONG rc;
HKEY hkey, hkey2;
int delete = 0, personal = 0;
for(int i = 1; i < argc; i++) if(!strcmp(argv[i], "/U")) delete = 1;
for(int i = 1; i < argc; i++) if(!strcmp(argv[i], "/Personal")) personal = 1;
if(personal) hk = HKEY_CURRENT_USER;
/* Needs to match JRins */
if(strncmp(R_STATUS, "Under ", 6) == 0)
snprintf(version, 40, "%s.%s Pre-release", R_MAJOR, R_MINOR);
else
snprintf(version, 40, "%s.%s %s", R_MAJOR, R_MINOR, R_STATUS);
if(delete) {
printf("unregistering R %s ... ", version);
snprintf(keyname, 60, "Software\\%s\\%s\\%s", PRODUCER, RK, version);
if (RegOpenKeyEx(hk, keyname, 0, KEY_SET_VALUE, &hkey) == ERROR_SUCCESS) {
RegDeleteValue(hkey, "InstallPath");
RegDeleteKey(hkey, version);
RegCloseKey(hkey);
} else
fprintf(stderr, "\nWarning: failed to open key '%s'\n", keyname);
snprintf(keyname, 60, "Software\\%s\\%s", PRODUCER, RK);
if (RegOpenKeyEx(hk, keyname, 0, KEY_SET_VALUE, &hkey) == ERROR_SUCCESS) {
RegDeleteValue(hkey, "InstallPath");
RegDeleteValue(hkey, "Current Version");
RegDeleteKey(hkey, version);
RegQueryInfoKey(hkey, NULL, NULL, NULL, &subkeys, NULL, NULL, NULL, NULL, NULL,
NULL, NULL);
RegCloseKey(hkey);
/* delete key if empty */
if (!subkeys &&
RegOpenKeyEx(hk, "Software\\R-core", 0, KEY_SET_VALUE, &hkey)
== ERROR_SUCCESS) {
RegDeleteKey(hkey, RK);
RegCloseKey(hkey);
}
} else
fprintf(stderr, "\nWarning: failed to open key '%s'\n", keyname);
snprintf(keyname, 60, "Software\\%s\\R\\%s", PRODUCER, version);
if (RegOpenKeyEx(hk, keyname, 0, KEY_SET_VALUE, &hkey) == ERROR_SUCCESS) {
RegDeleteValue(hkey, "InstallPath");
RegDeleteKey(hkey, version);
RegCloseKey(hkey);
} else
fprintf(stderr, "\nWarning: failed to open key '%s'\n", keyname);
snprintf(keyname, 60, "Software\\%s\\R", PRODUCER);
if (RegOpenKeyEx(hk, keyname, 0, KEY_SET_VALUE, &hkey) == ERROR_SUCCESS) {
RegDeleteValue(hkey, "InstallPath");
RegDeleteValue(hkey, "Current Version");
RegDeleteKey(hkey, version);
RegQueryInfoKey(hkey, NULL, NULL, NULL, &subkeys, NULL, NULL, NULL, NULL, NULL,
NULL, NULL);
RegCloseKey(hkey);
/* delete key if empty */
if (!subkeys &&
RegOpenKeyEx(hk, "Software\\R-core", 0, KEY_SET_VALUE, &hkey)
== ERROR_SUCCESS) {
RegDeleteKey(hkey, "R");
RegCloseKey(hkey);
}
printf("succeeded\n");
} else {
printf("was not registered\n");
exit(1);
}
} else {
printf("registering R %s ... ", version);
RHome = getRHOMElong(3);
snprintf(keyname, 60, "Software\\%s\\R", PRODUCER);
if ((rc = RegOpenKeyEx(hk, keyname, 0, KEY_ALL_ACCESS, &hkey))
!= ERROR_SUCCESS) {
/* failed to open key, so try to create it */
rc = RegCreateKey(hk, keyname, &hkey);
}
if(rc != ERROR_SUCCESS) {
fprintf(stderr, "\nError: failed to open key '%s'\n", keyname);
exit(1);
}
rc = RegSetValueEx(hkey, "InstallPath", 0, REG_SZ,
(CONST BYTE *)RHome, lstrlen(RHome)+1);
if (rc == ERROR_SUCCESS)
rc = RegSetValueEx(hkey, "Current Version", 0, REG_SZ,
(CONST BYTE *)version, lstrlen(version)+1);
if (rc == ERROR_SUCCESS)
rc = RegCreateKey(hkey, version, &hkey2);
if (rc == ERROR_SUCCESS) {
rc = RegSetValueEx(hkey2, "InstallPath", 0, REG_SZ,
(CONST BYTE *)RHome, lstrlen(RHome)+1);
RegCloseKey(hkey2);
}
RegCloseKey(hkey);
snprintf(keyname, 60, "Software\\%s\\%s", PRODUCER, RK);
if ((rc = RegOpenKeyEx(hk, keyname, 0,
KEY_ALL_ACCESS, &hkey)) != ERROR_SUCCESS) {
/* failed to open key, so try to create it */
rc = RegCreateKey(hk, keyname, &hkey);
}
if(rc != ERROR_SUCCESS) {
fprintf(stderr, "\nError: failed to open key '%s'\n", keyname);
exit(1);
}
rc = RegSetValueEx(hkey, "InstallPath", 0, REG_SZ,
(CONST BYTE *)RHome, lstrlen(RHome)+1);
rc = RegSetValueEx(hkey, "Current Version", 0, REG_SZ,
(CONST BYTE *)version, lstrlen(version)+1);
rc = RegCreateKey(hkey, version, &hkey2);
if (rc == ERROR_SUCCESS) {
rc = RegSetValueEx(hkey2, "InstallPath", 0, REG_SZ,
(CONST BYTE *)RHome, lstrlen(RHome)+1);
RegCloseKey(hkey2);
}
RegCloseKey(hkey);
printf("succeeded\n");
}
exit(0);
}