* Sync with recent trunk (r52637).
[reactos.git] / base / applications / regedit / regedit.c
index bd9bad5..e49f0e0 100644 (file)
@@ -52,7 +52,8 @@ static const char *usage =
     "This program is command-line compatible with Microsoft Windows\n"
     "regedit.\n";
 
-typedef enum {
+typedef enum
+{
     ACTION_UNDEF, ACTION_ADD, ACTION_EXPORT, ACTION_DELETE
 } REGEDIT_ACTION;
 
@@ -79,40 +80,52 @@ void get_file_name(LPWSTR *command_line, LPWSTR file_name)
     int pos = 0;                /* position of pointer "s" in *command_line */
     file_name[0] = 0;
 
-    if (!s[0]) {
+    if (!s[0])
+    {
         return;
     }
 
-    if (s[0] == L'"') {
+    if (s[0] == L'"')
+    {
         s++;
         (*command_line)++;
-        while(s[0] != L'"') {
-            if (!s[0]) {
+        while(s[0] != L'"')
+        {
+            if (!s[0])
+            {
                 fprintf(stderr, "%s: Unexpected end of file name!\n", getAppName());
                 exit(1);
             }
             s++;
             pos++;
         }
-    } else {
-        while(s[0] && !iswspace(s[0])) {
+    }
+    else
+    {
+        while(s[0] && !iswspace(s[0]))
+        {
             s++;
             pos++;
         }
     }
     memcpy(file_name, *command_line, pos * sizeof((*command_line)[0]));
     /* remove the last backslash */
-    if (file_name[pos - 1] == L'\\') {
+    if (file_name[pos - 1] == L'\\')
+    {
         file_name[pos - 1] = L'\0';
-    } else {
+    }
+    else
+    {
         file_name[pos] = L'\0';
     }
 
-    if (s[0]) {
+    if (s[0])
+    {
         s++;
         pos++;
     }
-    while(s[0] && iswspace(s[0])) {
+    while(s[0] && iswspace(s[0]))
+    {
         s++;
         pos++;
     }
@@ -121,64 +134,80 @@ void get_file_name(LPWSTR *command_line, LPWSTR file_name)
 
 BOOL PerformRegAction(REGEDIT_ACTION action, LPWSTR s)
 {
-    switch (action) {
-    case ACTION_ADD: {
-            WCHAR filename[MAX_PATH];
-            FILE *fp;
+    TCHAR szTitle[256], szText[256];
+    switch (action)
+    {
+    case ACTION_ADD:
+    {
+        WCHAR filename[MAX_PATH];
+        FILE *fp;
 
-            get_file_name(&s, filename);
-            if (!filename[0]) {
-                fprintf(stderr, "%s: No file name is specified\n", getAppName());
-                fprintf(stderr, usage);
-                exit(4);
-            }
+        get_file_name(&s, filename);
+        if (!filename[0])
+        {
+            fprintf(stderr, "%s: No file name is specified\n", getAppName());
+            fprintf(stderr, usage);
+            exit(4);
+        }
 
-            while(filename[0]) {
-                fp = _wfopen(filename, L"r");
-                if (fp == NULL)
-                {
-                    LPSTR p = GetMultiByteString(filename);
-                    perror("");
-                    fprintf(stderr, "%s: Can't open file \"%s\"\n", getAppName(), p);
-                    HeapFree(GetProcessHeap(), 0, p);
-                    exit(5);
-                }
-                import_registry_file(fp);
-                get_file_name(&s, filename);
+        while(filename[0])
+        {
+            fp = _wfopen(filename, L"r");
+            if (fp == NULL)
+            {
+                LPSTR p = GetMultiByteString(filename);
+                perror("");
+                fprintf(stderr, "%s: Can't open file \"%s\"\n", getAppName(), p);
+                HeapFree(GetProcessHeap(), 0, p);
+                exit(5);
             }
-            break;
+            import_registry_file(fp);
+            get_file_name(&s, filename);
+            LoadString(hInst, IDS_APP_TITLE, szTitle, sizeof(szTitle));
+            LoadString(hInst, IDS_IMPORTED_OK, szText, sizeof(szTitle));
+            /* show successful import */
+            MessageBox(NULL, szText, szTitle, MB_OK);
         }
-    case ACTION_DELETE: {
-            WCHAR reg_key_name[KEY_MAX_LEN];
-            get_file_name(&s, reg_key_name);
-            if (!reg_key_name[0]) {
-                fprintf(stderr, "%s: No registry key is specified for removal\n", getAppName());
-                fprintf(stderr, usage);
-                exit(6);
-            }
-            delete_registry_key(reg_key_name);
-            break;
+        break;
+    }
+    case ACTION_DELETE:
+    {
+        WCHAR reg_key_name[KEY_MAX_LEN];
+        get_file_name(&s, reg_key_name);
+        if (!reg_key_name[0])
+        {
+            fprintf(stderr, "%s: No registry key is specified for removal\n", getAppName());
+            fprintf(stderr, usage);
+            exit(6);
         }
-    case ACTION_EXPORT: {
-            WCHAR filename[MAX_PATH];
+        delete_registry_key(reg_key_name);
+        break;
+    }
+    case ACTION_EXPORT:
+    {
+        WCHAR filename[MAX_PATH];
 
-            filename[0] = _T('\0');
-            get_file_name(&s, filename);
-            if (!filename[0]) {
-                fprintf(stderr, "%s: No file name is specified\n", getAppName());
-                fprintf(stderr, usage);
-                exit(7);
-            }
+        filename[0] = _T('\0');
+        get_file_name(&s, filename);
+        if (!filename[0])
+        {
+            fprintf(stderr, "%s: No file name is specified\n", getAppName());
+            fprintf(stderr, usage);
+            exit(7);
+        }
 
-            if (s[0]) {
-                WCHAR reg_key_name[KEY_MAX_LEN];
-                get_file_name(&s, reg_key_name);
-                export_registry_key(filename, reg_key_name, REG_FORMAT_4);
-            } else {
-                export_registry_key(filename, NULL, REG_FORMAT_4);
-            }
-            break;
+        if (s[0])
+        {
+            WCHAR reg_key_name[KEY_MAX_LEN];
+            get_file_name(&s, reg_key_name);
+            export_registry_key(filename, reg_key_name, REG_FORMAT_4);
+        }
+        else
+        {
+            export_registry_key(filename, NULL, REG_FORMAT_4);
         }
+        break;
+    }
     default:
         fprintf(stderr, "%s: Unhandled action!\n", getAppName());
         exit(8);
@@ -196,9 +225,12 @@ BOOL PerformRegAction(REGEDIT_ACTION action, LPWSTR s)
  */
 static void error_unknown_switch(WCHAR chu, LPWSTR s)
 {
-    if (iswalpha(chu)) {
+    if (iswalpha(chu))
+    {
         fprintf(stderr, "%s: Undefined switch /%c!\n", getAppName(), chu);
-    } else {
+    }
+    else
+    {
         fprintf(stderr, "%s: Alphabetic character is expected after '%c' "
                 "in swit ch specification\n", getAppName(), *(s - 1));
     }
@@ -220,12 +252,16 @@ BOOL ProcessCmdLine(LPWSTR lpCmdLine)
         ch = *s;
         ch2 = *(s + 1);
         chu = (WCHAR)towupper(ch);
-        if (!ch2 || iswspace(ch2)) {
+        if (!ch2 || iswspace(ch2))
+        {
             if (chu == L'S' || chu == L'V')
             {
                 /* ignore these switches */
-            } else {
-                switch (chu) {
+            }
+            else
+            {
+                switch (chu)
+                {
                 case L'D':
                     action = ACTION_DELETE;
                     break;
@@ -242,14 +278,19 @@ BOOL ProcessCmdLine(LPWSTR lpCmdLine)
                 }
             }
             s++;
-        } else {
-            if (ch2 == L':') {
-                switch (chu) {
+        }
+        else
+        {
+            if (ch2 == L':')
+            {
+                switch (chu)
+                {
                 case L'L':
                     /* fall through */
                 case L'R':
                     s += 2;
-                    while (*s && !iswspace(*s)) {
+                    while (*s && !iswspace(*s))
+                    {
                         s++;
                     }
                     break;
@@ -257,7 +298,9 @@ BOOL ProcessCmdLine(LPWSTR lpCmdLine)
                     error_unknown_switch(chu, s);
                     break;
                 }
-            } else {
+            }
+            else
+            {
                 /* this is a file name, starting from '/' */
                 s--;
                 break;
@@ -265,16 +308,26 @@ BOOL ProcessCmdLine(LPWSTR lpCmdLine)
         }
         /* skip spaces to the next parameter */
         ch = *s;
-        while (ch && iswspace(ch)) {
+        while (ch && iswspace(ch))
+        {
             s++;
             ch = *s;
         }
     }
 
     if (*s && action == ACTION_UNDEF)
-        action = ACTION_ADD;
-
-    if (action == ACTION_UNDEF)
+           {
+         TCHAR szTitle[256], szText[256];
+         LoadString(hInst, IDS_APP_TITLE, szTitle, sizeof(szTitle));
+         LoadString(hInst, IDS_IMPORT_PROMPT, szText, sizeof(szTitle));        
+         /* request import confirmation */
+            if (MessageBox(NULL, szText, szTitle, MB_YESNO) == IDYES) 
+            {
+          action = ACTION_ADD;
+         }
+                else return TRUE;
+        }
+       if (action == ACTION_UNDEF)
         return FALSE;
 
     return PerformRegAction(action, s);