Files
gps/tools/local/circt/include/llvm/Support/AutoConvert.h
T
2026-07-12 11:01:51 +03:00

112 lines
3.0 KiB
C++

/*===- AutoConvert.h - Auto conversion between ASCII/EBCDIC -----*- 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
//
//===----------------------------------------------------------------------===//
//
// This file contains functions used for auto conversion between
// ASCII/EBCDIC codepages specific to z/OS.
//
//===----------------------------------------------------------------------===*/
#ifndef LLVM_SUPPORT_AUTOCONVERT_H
#define LLVM_SUPPORT_AUTOCONVERT_H
#ifdef __MVS__
#include <_Ccsid.h>
#endif
#ifdef __cplusplus
#include "llvm/ADT/Twine.h"
#include "llvm/Support/Error.h"
#include <system_error>
#endif /* __cplusplus */
#define CCSID_IBM_1047 1047
#define CCSID_UTF_8 1208
#define CCSID_ISO8859_1 819
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
int enablezOSAutoConversion(int FD);
int disablezOSAutoConversion(int FD);
int restorezOSStdHandleAutoConversion(int FD);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#ifdef __cplusplus
namespace llvm {
#ifdef __MVS__
/** \brief Set the tag information for a file descriptor. */
std::error_code setzOSFileTag(int FD, int CCSID, bool Text);
/** \brief Get the the tag ccsid for a file name or a file descriptor. */
ErrorOr<__ccsid_t> getzOSFileTag(const Twine &FileName, const int FD = -1);
/** \brief Query the file tag to determine if it needs conversion to UTF-8
* codepage.
*/
ErrorOr<bool> needzOSConversion(const Twine &FileName, const int FD = -1);
/** Copy the tag attributes from \a source to \a destination.
*
* @param Source The name of the source file.
* @param Destination The file descriptor of the destination file.
* @returns errc::success if the tag attributes were copied successfully,
* otherwise returns a specific error_code.
*/
std::error_code copyFileTagAttributes(const std::string &Source,
const int DestinationFD);
#endif /* __MVS__*/
inline std::error_code disableAutoConversion(int FD) {
#ifdef __MVS__
if (::disablezOSAutoConversion(FD) == -1)
return errnoAsErrorCode();
#endif
return std::error_code();
}
inline std::error_code enableAutoConversion(int FD) {
#ifdef __MVS__
if (::enablezOSAutoConversion(FD) == -1)
return errnoAsErrorCode();
#endif
return std::error_code();
}
inline std::error_code restoreStdHandleAutoConversion(int FD) {
#ifdef __MVS__
if (::restorezOSStdHandleAutoConversion(FD) == -1)
return errnoAsErrorCode();
#endif
return std::error_code();
}
inline std::error_code setFileTag(int FD, int CCSID, bool Text) {
#ifdef __MVS__
return setzOSFileTag(FD, CCSID, Text);
#endif
return std::error_code();
}
inline ErrorOr<bool> needConversion(const Twine &FileName, const int FD = -1) {
#ifdef __MVS__
return needzOSConversion(FileName, FD);
#endif
return false;
}
} /* namespace llvm */
#endif /* __cplusplus */
#endif /* LLVM_SUPPORT_AUTOCONVERT_H */