Make libbcc public.

This commit is not expected to change any functionality.
diff --git a/lib/RenderScript/RSInfoWriter.cpp b/lib/RenderScript/RSInfoWriter.cpp
new file mode 100644
index 0000000..1f19839
--- /dev/null
+++ b/lib/RenderScript/RSInfoWriter.cpp
@@ -0,0 +1,234 @@
+/*
+ * Copyright 2012, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//===----------------------------------------------------------------------===//
+// This file implements RSInfo::write()
+//===----------------------------------------------------------------------===//
+
+#include "bcc/RenderScript/RSInfo.h"
+
+#include "bcc/Support/DebugHelper.h"
+#include "bcc/Support/OutputFile.h"
+
+using namespace bcc;
+
+namespace {
+
+template<typename ItemType, typename ItemContainer> inline bool
+helper_adapt_list_item(ItemType &pResult, const RSInfo &pInfo,
+                       const typename ItemContainer::const_iterator &pItem);
+
+template<> inline bool
+helper_adapt_list_item<rsinfo::DependencyTableItem, RSInfo::DependencyTableTy>(
+    rsinfo::DependencyTableItem &pResult,
+    const RSInfo &pInfo,
+    const RSInfo::DependencyTableTy::const_iterator &pItem) {
+  pResult.id = pInfo.getStringIdxInPool(pItem->first);
+  pResult.sha1 =
+      pInfo.getStringIdxInPool(reinterpret_cast<const char *>(pItem->second));
+
+  if (pResult.id == rsinfo::gInvalidStringIndex) {
+    ALOGE("RS dependency table contains invalid source id string '%s'.",
+          pItem->first);
+    return false;
+  }
+
+  if (pResult.sha1 == rsinfo::gInvalidStringIndex) {
+    ALOGE("RS dependency table contains invalid SHA-1 checksum string in '%s'.",
+          pItem->first);
+    return false;
+  }
+
+  return true;
+}
+
+template<> inline bool
+helper_adapt_list_item<rsinfo::PragmaItem, RSInfo::PragmaListTy>(
+    rsinfo::PragmaItem &pResult,
+    const RSInfo &pInfo,
+    const RSInfo::PragmaListTy::const_iterator &pItem) {
+  pResult.key = pInfo.getStringIdxInPool(pItem->first);
+  pResult.value = pInfo.getStringIdxInPool(pItem->second);
+
+  if (pResult.key == rsinfo::gInvalidStringIndex) {
+    ALOGE("RS pragma list contains invalid string '%s' for key.", pItem->first);
+    return false;
+  }
+
+  if (pResult.value == rsinfo::gInvalidStringIndex) {
+    ALOGE("RS pragma list contains invalid string '%s' for value.",
+          pItem->second);
+    return false;
+  }
+
+  return true;
+}
+
+template<> inline bool
+helper_adapt_list_item<rsinfo::ObjectSlotItem, RSInfo::ObjectSlotListTy>(
+    rsinfo::ObjectSlotItem &pResult,
+    const RSInfo &pInfo,
+    const RSInfo::ObjectSlotListTy::const_iterator &pItem) {
+  pResult.slot = *pItem;
+  return true;
+}
+
+template<> inline bool
+helper_adapt_list_item<rsinfo::ExportVarNameItem, RSInfo::ExportVarNameListTy>(
+    rsinfo::ExportVarNameItem &pResult,
+    const RSInfo &pInfo,
+    const RSInfo::ExportVarNameListTy::const_iterator &pItem) {
+  pResult.name = pInfo.getStringIdxInPool(*pItem);
+
+  if (pResult.name == rsinfo::gInvalidStringIndex) {
+    ALOGE("RS export vars contains invalid string '%s' for name.", *pItem);
+    return false;
+  }
+
+  return true;
+}
+
+template<> inline bool
+helper_adapt_list_item<rsinfo::ExportFuncNameItem,
+                       RSInfo::ExportFuncNameListTy>(
+    rsinfo::ExportFuncNameItem &pResult,
+    const RSInfo &pInfo,
+    const RSInfo::ExportFuncNameListTy::const_iterator &pItem) {
+  pResult.name = pInfo.getStringIdxInPool(*pItem);
+
+  if (pResult.name == rsinfo::gInvalidStringIndex) {
+    ALOGE("RS export funcs contains invalid string '%s' for name.", *pItem);
+    return false;
+  }
+
+  return true;
+}
+
+template<> inline bool
+helper_adapt_list_item<rsinfo::ExportForeachFuncItem,
+                       RSInfo::ExportForeachFuncListTy>(
+    rsinfo::ExportForeachFuncItem &pResult,
+    const RSInfo &pInfo,
+    const RSInfo::ExportForeachFuncListTy::const_iterator &pItem) {
+  pResult.name = pInfo.getStringIdxInPool(pItem->first);
+  pResult.signature = pItem->second;
+
+  if (pResult.name == rsinfo::gInvalidStringIndex) {
+    ALOGE("RS export foreach contains invalid string '%s' for name.",
+          pItem->first);
+    return false;
+  }
+
+  return true;
+}
+
+template<typename ItemType, typename ItemContainer>
+inline bool helper_write_list(OutputFile &pOutput,
+                              const RSInfo &pInfo,
+                              const rsinfo::ListHeader &pHeader,
+                              ItemContainer &pList) {
+  ItemType item;
+
+  for (typename ItemContainer::const_iterator item_iter = pList.begin(),
+          item_end = pList.end(); item_iter != item_end; item_iter++) {
+    // Convert each entry in the pList to ItemType.
+    if (!helper_adapt_list_item<ItemType, ItemContainer>(item,
+                                                         pInfo,
+                                                         item_iter)) {
+      return false;
+    }
+    // And write out an item.
+    if (pOutput.write(&item, sizeof(item)) != sizeof(item)) {
+      ALOGE("Cannot write out item of %s for RSInfo file %s! (%s)",
+            rsinfo::GetItemTypeName<ItemType>(), pOutput.getName().c_str(),
+            pOutput.getErrorMessage().c_str());
+      return false;
+    }
+  }
+
+  return true;
+}
+
+} // end anonymous namespace
+
+bool RSInfo::write(OutputFile &pOutput) {
+  off_t initial_offset = pOutput.tell();
+  const char *output_filename = pOutput.getName().c_str();
+
+  if (pOutput.hasError()) {
+    ALOGE("Invalid RS info file %s for output! (%s)",
+          output_filename, pOutput.getErrorMessage().c_str());
+    return false;
+  }
+
+  // Layout.
+  if (!layout(initial_offset)) {
+    return false;
+  }
+
+  // Write header.
+  if (pOutput.write(&mHeader, sizeof(mHeader)) != sizeof(mHeader)) {
+    ALOGE("Cannot write out the header for RSInfo file %s! (%s)",
+          output_filename, pOutput.getErrorMessage().c_str());
+    return false;
+  }
+
+  // Write string pool.
+  if (static_cast<size_t>(pOutput.write(mStringPool, mHeader.strPoolSize))
+          != mHeader.strPoolSize) {
+    ALOGE("Cannot write out the string pool for RSInfo file %s! (%s)",
+          output_filename, pOutput.getErrorMessage().c_str());
+    return false;
+  }
+
+  // Write dependencyTable.
+  if (!helper_write_list<rsinfo::DependencyTableItem, DependencyTableTy>
+        (pOutput, *this, mHeader.dependencyTable, mDependencyTable)) {
+    return false;
+  }
+
+  // Write pragmaList.
+  if (!helper_write_list<rsinfo::PragmaItem, PragmaListTy>
+        (pOutput, *this, mHeader.pragmaList, mPragmas)) {
+    return false;
+  }
+
+  // Write objectSlotList.
+  if (!helper_write_list<rsinfo::ObjectSlotItem, ObjectSlotListTy>
+        (pOutput, *this, mHeader.objectSlotList, mObjectSlots)) {
+    return false;
+  }
+
+  // Write exportVarNameList.
+  if (!helper_write_list<rsinfo::ExportVarNameItem, ExportVarNameListTy>
+        (pOutput, *this, mHeader.exportVarNameList, mExportVarNames)) {
+    return false;
+  }
+
+  // Write exportFuncNameList.
+  if (!helper_write_list<rsinfo::ExportFuncNameItem, ExportFuncNameListTy>
+        (pOutput, *this, mHeader.exportFuncNameList, mExportFuncNames)) {
+    return false;
+  }
+
+  // Write exportForeachFuncList.
+  if (!helper_write_list<rsinfo::ExportForeachFuncItem, ExportForeachFuncListTy>
+        (pOutput, *this, mHeader.exportForeachFuncList, mExportForeachFuncs)) {
+    return false;
+  }
+
+  return true;
+}