Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / base / system / diskpart / diskpart.c
diff --git a/base/system/diskpart/diskpart.c b/base/system/diskpart/diskpart.c
new file mode 100644 (file)
index 0000000..30b7da2
--- /dev/null
@@ -0,0 +1,196 @@
+/*
+ * PROJECT:         ReactOS DiskPart
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            base/system/diskpart/diskpart.c
+ * PURPOSE:         Manages all the partitions of the OS in an interactive way.
+ * PROGRAMMERS:     Lee Schroeder
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "diskpart.h"
+
+/* FUNCTIONS ******************************************************************/
+
+VOID
+ShowHeader(VOID)
+{
+    WCHAR szComputerName[MAX_STRING_SIZE];
+    DWORD comp_size = MAX_STRING_SIZE;
+
+    /* Get the name of the computer for us and change the value of comp_name */
+    GetComputerNameW(szComputerName, &comp_size);
+
+    /* TODO: Remove this section of code when program becomes stable enough for production use. */
+    ConPuts(StdOut, L"\n*WARNING*: This program is incomplete and may not work properly.\n");
+
+    /* Print the header information */
+    ConPuts(StdOut, L"\n");
+    ConResPuts(StdOut, IDS_APP_HEADER);
+    ConPuts(StdOut, L"\n");
+    ConResPuts(StdOut, IDS_APP_LICENSE);
+    ConResPrintf(StdOut, IDS_APP_CURR_COMPUTER, szComputerName);
+}
+
+/*
+ * RunScript(const char *filename):
+ * opens the file, reads the contents, convert the text into readable
+ * code for the computer, and then execute commands in order.
+ */
+BOOL
+RunScript(LPCWSTR filename)
+{
+    FILE *script;
+    WCHAR tmp_string[MAX_STRING_SIZE];
+
+    /* Open the file for processing */
+    script = _wfopen(filename, L"r");
+    if (script == NULL)
+    {
+        /* if there was problems opening the file */
+        ConResPrintf(StdErr, IDS_ERROR_MSG_NO_SCRIPT, filename);
+        return FALSE; /* if there is no script, exit the program */
+    }
+
+    /* Read and process the script */
+    while (fgetws(tmp_string, MAX_STRING_SIZE, script) != NULL)
+    {
+        if (InterpretScript(tmp_string) == FALSE)
+        {
+            fclose(script);
+            return FALSE;
+        }
+    }
+
+    /* Close the file */
+    fclose(script);
+
+    return TRUE;
+}
+
+/*
+ * wmain():
+ * Main entry point of the application.
+ */
+int wmain(int argc, const LPWSTR argv[])
+{
+    LPCWSTR script = NULL;
+    LPCWSTR tmpBuffer = NULL;
+    WCHAR appTitle[50];
+    int index, timeout;
+    int result = EXIT_SUCCESS;
+
+    /* Initialize the Console Standard Streams */
+    ConInitStdStreams();
+
+    /* Sets the title of the program so the user will have an easier time
+    determining the current program, especially if diskpart is running a
+    script */
+    K32LoadStringW(GetModuleHandle(NULL), IDS_APP_HEADER, appTitle, ARRAYSIZE(appTitle));
+    SetConsoleTitleW(appTitle);
+
+    /* Sets the timeout value to 0 just in case the user doesn't
+    specify a value */
+    timeout = 0;
+
+    CreatePartitionList();
+
+    /* If there are no command arguments, then go straight to the interpreter */
+    if (argc < 2)
+    {
+        ShowHeader();
+        InterpretMain();
+    }
+    /* If there are command arguments, then process them */
+    else
+    {
+        for (index = 1; index < argc; index++)
+        {
+            /* checks for flags */
+            if ((argv[index][0] == '/')||
+                (argv[index][0] == '-'))
+            {
+                tmpBuffer = argv[index] + 1;
+            }
+            else
+            {
+                /* If there is no flag, then return an error */
+                ConResPrintf(StdErr, IDS_ERROR_MSG_BAD_ARG, argv[index]);
+                result = EXIT_FAILURE;
+                goto done;
+            }
+
+            /* Checks for the /? flag first since the program
+            exits as soon as the usage list is shown. */
+            if (_wcsicmp(tmpBuffer, L"?") == 0)
+            {
+                ConResPuts(StdOut, IDS_APP_USAGE);
+                result = EXIT_SUCCESS;
+                goto done;
+            }
+            /* Checks for the script flag */
+            else if (_wcsicmp(tmpBuffer, L"s") == 0)
+            {
+                if ((index + 1) < argc)
+                {
+                    index++;
+                    script = argv[index];
+                }
+            }
+            /* Checks for the timeout flag */
+            else if (_wcsicmp(tmpBuffer, L"t") == 0)
+            {
+                if ((index + 1) < argc)
+                {
+                    index++;
+                    timeout = _wtoi(argv[index]);
+
+                    /* If the number is a negative number, then
+                    change it so that the time is executed properly. */
+                    if (timeout < 0)
+                        timeout = 0;
+                }
+            }
+            else
+            {
+                /* Assume that the flag doesn't exist. */
+                ConResPrintf(StdErr, IDS_ERROR_MSG_BAD_ARG, tmpBuffer);
+                result = EXIT_FAILURE;
+                goto done;
+            }
+        }
+
+        /* Shows the program information */
+        ShowHeader();
+
+        /* Now we process the filename if it exists */
+        if (script != NULL)
+        {
+            /* if the timeout is greater than 0, then assume
+            that the user specified a specific time. */
+            if (timeout > 0)
+                Sleep(timeout * 1000);
+
+            if (RunScript(script) == FALSE)
+            {
+                result = EXIT_FAILURE;
+                goto done;
+            }
+        }
+        else
+        {
+            /* Exit failure since the user wanted to run a script */
+            ConResPrintf(StdErr, IDS_ERROR_MSG_NO_SCRIPT, script);
+            result = EXIT_FAILURE;
+            goto done;
+        }
+    }
+
+    /* Let the user know the program is exiting */
+    ConResPuts(StdOut, IDS_APP_LEAVING);
+
+done:
+    DestroyPartitionList();
+
+    return result;
+}