src/main.cpp
changeset 251 ca99a81745fe
parent 232 2b8512340180
     1.1 --- a/src/main.cpp	Sat Dec 29 00:55:38 2012 -0800
     1.2 +++ b/src/main.cpp	Tue Jan 01 15:34:07 2013 -0800
     1.3 @@ -20,6 +20,14 @@
     1.4  #include <stdlib.h>
     1.5  #include <string.h>
     1.6  #include "../include/keima.h"
     1.7 +#include "Utility.h"
     1.8 +#include "Platform.h"
     1.9 +#ifdef WIN32
    1.10 +# include <Windows.h>
    1.11 +# include <direct.h>
    1.12 +#else
    1.13 +# include <unistd.h>
    1.14 +#endif
    1.15  
    1.16  using namespace Ke;
    1.17  
    1.18 @@ -34,11 +42,22 @@
    1.19  
    1.20          IStackFrameIterator *iter = Keima::NewStackFrameIterator();
    1.21          unsigned index = 0;
    1.22 +
    1.23 +        const char *filename = iter->source();
    1.24 +        if (!filename)
    1.25 +            filename = "<anonymous>";
    1.26 +        if (const char *tail = strrchr(filename, '/'))
    1.27 +            filename = tail + 1;
    1.28 +#ifdef WIN32
    1.29 +        if (const char *tail = strrchr(filename, '\\'))
    1.30 +            filename = tail + 1;
    1.31 +#endif
    1.32 +
    1.33          while (!iter->done() && index < 10) {
    1.34              fprintf(stderr, "[%d] %s (%s line %d)\n",
    1.35                      index,
    1.36                      iter->function(),
    1.37 -                    iter->source(),
    1.38 +                    filename,
    1.39                      iter->lineNumber());
    1.40              iter->prev();
    1.41              index++;
    1.42 @@ -107,6 +126,14 @@
    1.43      if (!Keima::Initialize())
    1.44          return 1;
    1.45  
    1.46 +    ke::AutoFree<char> fullpath;
    1.47 +    if (!ke::OS::GetAbsolutePath(argv[1], fullpath))
    1.48 +        return 1;
    1.49 +
    1.50 +    ke::AutoFree<char> path, name;
    1.51 +    if (!ke::OS::SplitPath(*fullpath, path, name))
    1.52 +        return 1;
    1.53 +
    1.54      int rval = 0;
    1.55  
    1.56      Keima::InstallMessageReporter(&s_Reporter);
    1.57 @@ -115,7 +142,13 @@
    1.58          Keima::SetPublicFunctionListener(&entry);
    1.59  
    1.60          HandleScope scope;
    1.61 -        if (!Compile(argv[1])) {
    1.62 +        Local<Package> package = Package::New(Handle<Package>(), Handle<String>(), *path, Package::Normal);
    1.63 +        if (!package) {
    1.64 +            rval = 1;
    1.65 +            break;
    1.66 +        }
    1.67 +
    1.68 +        if (!Keima::Compile(package, *name)) {
    1.69              rval = 1;
    1.70              break;
    1.71          }