]> git.saurik.com Git - cycript.git/blobdiff - Console.cpp
Implemented support for regular expression literals, moved %debug to -DYYDEBUG in...
[cycript.git] / Console.cpp
index fdfc05449ec2c71f41aa71ab64975adfad488557..6ed69e66dce574b5dcf16d79617720bd8aa7ae05 100644 (file)
@@ -91,6 +91,17 @@ static void sigint(int) {
     }
 }
 
+#if YYDEBUG
+static bool bison_;
+#endif
+
+void Setup(cy::parser &parser) {
+#if YYDEBUG
+    if (bison_)
+        parser.set_debug_level(1);
+#endif
+}
+
 void Run(int socket, const char *data, size_t size, FILE *fout = NULL, bool expand = false) {
     CYPool pool;
 
@@ -218,6 +229,7 @@ static void Console(int socket) {
         else {
             CYDriver driver("");
             cy::parser parser(driver);
+            Setup(parser);
 
             driver.data_ = command.c_str();
             driver.size_ = command.size();
@@ -264,7 +276,8 @@ static void Console(int socket) {
                 code = command;
             else {
                 std::ostringstream str;
-                driver.source_->Show(str);
+                CYOutput out(str);
+                driver.source_->Show(out);
                 code = str.str();
             }
         }
@@ -301,14 +314,31 @@ static void *Map(const char *path, size_t *psize) {
 int main(int argc, char *argv[]) {
     bool tty(isatty(STDIN_FILENO));
     pid_t pid(_not(pid_t));
+    bool compile(false);
 
-    for (;;) switch (getopt(argc, argv, "p:")) {
+    for (;;) switch (getopt(argc, argv, "cg:p:")) {
         case -1:
             goto getopt;
         case '?':
-            fprintf(stderr, "usage: cycript [-p <pid>] [<script> [<arg>...]]\n");
+            fprintf(stderr, "usage: cycript [-c] [-p <pid>] [<script> [<arg>...]]\n");
             return 1;
 
+        case 'c':
+            compile = true;
+        break;
+
+        case 'g':
+            if (false);
+#if YYDEBUG
+            else if (strcmp(optarg, "bison") == 0)
+                bison_ = true;
+#endif
+            else {
+                fprintf(stderr, "invalid name for -g\n");
+                return 1;
+            }
+        break;
+
         case 'p': {
             size_t size(strlen(optarg));
             char *end;
@@ -322,11 +352,16 @@ int main(int argc, char *argv[]) {
 
     const char *script;
 
-    if (optind < argc - 1 && pid != _not(pid_t)) {
+    if (pid != _not(pid_t) && optind < argc - 1) {
         fprintf(stderr, "-p cannot set argv\n");
         return 1;
     }
 
+    if (pid != _not(pid_t) && compile) {
+        fprintf(stderr, "-p conflicts with -c\n");
+        return 1;
+    }
+
     if (optind == argc)
         script = NULL;
     else {
@@ -362,6 +397,7 @@ int main(int argc, char *argv[]) {
     else {
         CYDriver driver(script ?: "<stdin>");
         cy::parser parser(driver);
+        Setup(parser);
 
         char *start, *end;
 
@@ -396,9 +432,13 @@ int main(int argc, char *argv[]) {
                 Run(socket, start, end - start, stdout);
             else {
                 std::ostringstream str;
-                driver.source_->Show(str);
+                CYOutput out(str);
+                driver.source_->Show(out);
                 std::string code(str.str());
-                Run(socket, code);
+                if (compile)
+                    std::cout << code;
+                else
+                    Run(socket, code);
             }
     }