Skip to content

[libc] Add strftime_l #127708

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Feb 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions libc/config/baremetal/aarch64/entrypoints.txt
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,8 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.time.gmtime
libc.src.time.gmtime_r
libc.src.time.mktime
libc.src.time.strftime
libc.src.time.strftime_l
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you should add strftime_l to the other targets as well. I should probably also look into adding strftime to more targets, I think I only added it to x86_64/linux

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

libc.src.time.timespec_get

# internal entrypoints
Expand Down
2 changes: 2 additions & 0 deletions libc/config/baremetal/arm/entrypoints.txt
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,8 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.time.gmtime
libc.src.time.gmtime_r
libc.src.time.mktime
libc.src.time.strftime
libc.src.time.strftime_l
libc.src.time.timespec_get

# internal entrypoints
Expand Down
2 changes: 2 additions & 0 deletions libc/config/baremetal/riscv/entrypoints.txt
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,8 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.time.gmtime
libc.src.time.gmtime_r
libc.src.time.mktime
libc.src.time.strftime
libc.src.time.strftime_l
libc.src.time.timespec_get

# internal entrypoints
Expand Down
1 change: 1 addition & 0 deletions libc/config/linux/x86_64/entrypoints.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1128,6 +1128,7 @@ if(LLVM_LIBC_FULL_BUILD)
libc.src.time.mktime
libc.src.time.nanosleep
libc.src.time.strftime
libc.src.time.strftime_l
libc.src.time.time
libc.src.time.timespec_get

Expand Down
11 changes: 11 additions & 0 deletions libc/include/time.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ types:
- type_name: time_t
- type_name: clock_t
- type_name: size_t
- type_name: locale_t
enums: []
objects: []
functions:
Expand Down Expand Up @@ -100,6 +101,16 @@ functions:
- type: size_t
- type: const char *__restrict
- type: const struct tm *__restrict
- name: strftime_l
standard:
- stdc
return_type: size_t
arguments:
- type: char *__restrict
- type: size_t
- type: const char *__restrict
- type: const struct tm *__restrict
- type: locale_t
- name: time
standard:
- stdc
Expand Down
14 changes: 14 additions & 0 deletions libc/src/time/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,20 @@ add_entrypoint_object(
libc.src.time.strftime_core.strftime_main
)

add_entrypoint_object(
strftime_l
SRCS
strftime_l.cpp
HDRS
strftime_l.h
DEPENDS
libc.hdr.types.locale_t
libc.hdr.types.size_t
libc.hdr.types.struct_tm
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this needs the rest of the dependencies from strftime

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

libc.src.stdio.printf_core.writer
libc.src.time.strftime_core.strftime_main
)

add_entrypoint_object(
time
SRCS
Expand Down
1 change: 0 additions & 1 deletion libc/src/time/strftime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(size_t, strftime,
(char *__restrict buffer, size_t buffsz,
const char *__restrict format, const tm *timeptr)) {

printf_core::WriteBuffer wb(buffer, (buffsz > 0 ? buffsz - 1 : 0));
printf_core::Writer writer(&wb);
int ret = strftime_core::strftime_main(&writer, format, timeptr);
Expand Down
33 changes: 33 additions & 0 deletions libc/src/time/strftime_l.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//===-- Implementation of strftime_l function -----------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "src/time/strftime_l.h"
#include "hdr/types/size_t.h"
#include "hdr/types/struct_tm.h"
#include "include/llvm-libc-types/locale_t.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
#include "src/stdio/printf_core/writer.h"
#include "src/time/strftime_core/strftime_main.h"

namespace LIBC_NAMESPACE_DECL {

// TODO: Add support for locales.
LLVM_LIBC_FUNCTION(size_t, strftime_l,
(char *__restrict buffer, size_t count,
const char *__restrict format,
const struct tm *__restrict tp, locale_t)) {
printf_core::WriteBuffer wb(buffer, (buffsz > 0 ? buffsz - 1 : 0));
printf_core::Writer writer(&wb);
int ret = strftime_core::strftime_main(&writer, format, timeptr);
if (buffsz > 0) // if the buffsz is 0 the buffer may be a null pointer.
wb.buff[wb.buff_cur] = '\0';
return (ret < 0 || static_cast<size_t>(ret) > buffsz) ? 0 : ret;
}

} // namespace LIBC_NAMESPACE_DECL
25 changes: 25 additions & 0 deletions libc/src/time/strftime_l.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//===-- Implementation header for strftime_l --------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIBC_SRC_TIME_STRFTIME_L_H
#define LLVM_LIBC_SRC_TIME_STRFTIME_L_H

#include "hdr/types/size_t.h"
#include "hdr/types/struct_tm.h"
#include "include/llvm-libc-types/locale_t.h"
#include "src/__support/macros/config.h"

namespace LIBC_NAMESPACE_DECL {

size_t strftime_l(char *__restrict buffer, size_t count,
const char *__restrict format, const struct tm *__restrict tp,
locale_t);

} // namespace LIBC_NAMESPACE_DECL

#endif // LLVM_LIBC_SRC_TIME_STRFTIME_L_H
Loading