From 5bef4576861651caf76fbb163ecf09d93dda57ca Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Wed, 8 Sep 2021 15:02:55 -0700 Subject: Add obstack_printf to libobstack Add a reimplementation of obstack_printf to libobstack, and wrap libiberty's obstack.h with a version that declares obstack_printf. Bug: 199322054 Test: m USE_HOST_MUSL=true abidw Change-Id: I3988d35ca506fbe6ad61b4b987c637b5ba31e67b --- Android.bp | 2 ++ android/include/obstack.h | 26 ++++++++++++++++++++++++++ android/obstack_printf.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 android/include/obstack.h create mode 100644 android/obstack_printf.c diff --git a/Android.bp b/Android.bp index e37836e..00a3134 100644 --- a/Android.bp +++ b/Android.bp @@ -18,9 +18,11 @@ cc_library_host_static { }, srcs: [ "libiberty/obstack.c", + "android/obstack_printf.c", ], local_include_dirs: ["android"], export_include_dirs: [ + "android/include", "include", ], visibility: [ diff --git a/android/include/obstack.h b/android/include/obstack.h new file mode 100644 index 0000000..a45421e --- /dev/null +++ b/android/include/obstack.h @@ -0,0 +1,26 @@ +/* + * Copyright 2021, 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 is a wrapper around gnulib's obstack.h to add obstack_printf. + */ + +#pragma once + +#include_next + +int obstack_printf(struct obstack *obs, const char *format, ...) + __attribute__((__format__(printf, 2, 3))); diff --git a/android/obstack_printf.c b/android/obstack_printf.c new file mode 100644 index 0000000..647d7f7 --- /dev/null +++ b/android/obstack_printf.c @@ -0,0 +1,42 @@ +/* + * Copyright 2021, 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 is a reimplementation of obstack_printf for use by libcpu, which + * uses it to print an error message. + */ + +#include +#include +#include +#include + +int __attribute__((__format__(printf, 2, 3))) obstack_printf(struct obstack *obs, const char *format, ...) { + + va_list ap; + va_start(ap, format); + + char* str = NULL; + int len = vasprintf(&str, format, ap); + if (len < 0) { + return len; + } + + obstack_grow(obs, str, len); + free(str); + + return len; +} -- cgit v1.2.3