158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/*
258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Copyright 2013 Google Inc.
358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger *
458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * found in the LICENSE file.
658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */
758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkLua.h"
958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkGraphics.h"
1058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkStream.h"
1158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkData.h"
1258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkOSFile.h"
1358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
1458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerextern "C" {
1558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    #include "lua.h"
1658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    #include "lualib.h"
1758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    #include "lauxlib.h"
1858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
1958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
2058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic SkData* read_into_data(const char file[]) {
2158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(file));
2258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    if (!stream.get()) {
2358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        return SkData::NewEmpty();
2458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
2558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    size_t len = stream->getLength();
2658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    void* buffer = sk_malloc_throw(len);
2758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    stream->read(buffer, len);
2858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    return SkData::NewFromMalloc(buffer, len);
2958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
3058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
3158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerint tool_main(int argc, char** argv);
3258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerint tool_main(int argc, char** argv) {
3358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkAutoGraphics ag;
3458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkLua L;
3558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
3658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    for (int i = 1; i < argc; ++i) {
3758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        SkData* data = NULL;
3858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        const void* ptr;
3958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        size_t len;
4058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
4158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (!strcmp(argv[i], "--lua") && i < argc-1) {
4258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            ptr = argv[i + 1];
4358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            len = strlen(argv[i + 1]);
4458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            i += 1;
4558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        } else {
4658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            data = read_into_data(argv[i]);
4758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            ptr = data->data();
4858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            len = data->size();
4958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        }
5058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (!L.runCode(ptr, len)) {
5158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            SkDebugf("failed to load %s\n", argv[i]);
5258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            exit(-1);
5358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        }
5458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        SkSafeUnref(data);
5558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
5658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    return 0;
5758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
5858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
5958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#if !defined SK_BUILD_FOR_IOS
6058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerint main(int argc, char * const argv[]) {
6158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    return tool_main(argc, (char**) argv);
6258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
6358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#endif
64