Build successful,add BUILD.gn, modify 13 files.Add OAT related files,OAT.xml,README.OpenSource and README.md.

Signed-off-by: xlfeng <xulifeng7@huawei.com>
This commit is contained in:
xlfeng
2021-12-14 19:35:57 +08:00
parent 7e8cb64a15
commit 8eac1640ba
17 changed files with 513 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
#Copyright (c) 2021 Huawei Device Co., Ltd.
#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.
import("//build/ohos.gni")
import("//build/ohos/ndk/ndk.gni")
config("gptdisk_config") {
include_dirs = [
".",
"//third_party/e2fsprogs/lib/",
"//third_party/popt/",
]
cflags_cc = [
"-Wall",
"-D_FILE_OFFSET_BITS=64",
"-Wno-unused-parameter",
"-Wno-pragma-pack",
"-Wno-error=header-hygiene",
"-Wno-register",
]
}
ohos_executable("sgdisk") {
install_enable = true
sources = [
"attributes.cc",
"basicmbr.cc",
"bsd.cc",
"crc32.cc",
"diskio-unix.cc",
"diskio.cc",
"gpt.cc",
"gptcl.cc",
"gptpart.cc",
"guid.cc",
"mbr.cc",
"mbrpart.cc",
# "ohos_popt.cc",
"parttypes.cc",
"sgdisk.cc",
"support.cc",
]
public_configs = [ ":gptdisk_config" ]
deps = [
"//third_party/e2fsprogs/lib/uuid:libext2_uuid",
"//third_party/popt:popt_static",
]
subsystem_name = "storage"
part_name = "storage_standard"
}
+113
View File
@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright (c) 2021 Huawei Device Co., Ltd.
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 the configuration file template for OpenHarmony OSS Audit Tool, please copy it to your project root dir and modify it refer to OpenHarmony/tools_oat/README.
All configurations in this file will be merged to OAT-Default.xml, if you have any questions or concerns, please create issue in OpenHarmony/tools_oat and @jalenchen or chenyaxun.
licensefile:
1.If the project don't have "LICENSE" in root dir, please define all the license files in this project in , OAT will check license files according to this rule.
policylist:
1. policy: If the OAT-Default.xml policies do not meet your requirements, please add policies here.
2. policyitem: The fields type, name, path, desc is required, and the fields rule, group, filefilter is optional,the default value is:
<policyitem type="" name="" path="" desc="" rule="may" group="defaultGroup" filefilter="defaultPolicyFilter"/>
3. policyitem type:
"compatibility" is used to check license compatibility in the specified path;
"license" is used to check source license header in the specified path;
"copyright" is used to check source copyright header in the specified path;
"import" is used to check source dependency in the specified path, such as import ... ,include ...
"filetype" is used to check file type in the specified path, supported file types: archive, binary
"filename" is used to check whether the specified file exists in the specified path(projectroot means the root dir of the project), supported file names: LICENSE, README, README.OpenSource
4. policyitem name: This field is used for define the license, copyright, "*" means match all, the "!" prefix means could not match this value. For example, "!GPL" means can not use GPL license.
5. policyitem path: This field is used for define the source file scope to apply this policyitem, the "!" prefix means exclude the files. For example, "!.*/lib/.*" means files in lib dir will be exclude while process this policyitem.
6. policyitem rule and group: These two fields are used together to merge policy results. "may" policyitems in the same group means any one in this group passed, the result will be passed.
7. policyitem filefilter: Used to bind filefilter which define filter rules.
7. policyitem desc: Used to describe the reason of this policy item, committers will check this while merging the code.
8. filefilter: Filter rules, the type filename is used to filter file name, the type filepath is used to filter file path.
Note:If the text contains special characters, please escape them according to the following rules:
" == &quot;
& == &amp;
' == &apos;
< == &lt;
> == &gt;
-->
<configuration>
<oatconfig>
<licensefile>./</licensefile>
<policylist>
<policy name="projectPolicy" desc="">
<policyitem type="copyright" name="Roderick W. Smith" path=".*" rule="may" group="defaultGroup" filefilter="copyrightPolicyFilter" desc=""/>
<policyitem type="copyright" name="Guillaume Delacour " path=".*" rule="may" group="defaultGroup" filefilter="copyrightPolicyFilter" desc=""/>
<policyitem type="license" name="GPL-2.0+" path=".*" rule="may" group="defaultGroup" filefilter="GPL-2.0+" desc=""/>
<policyitem type="license" name="GPL-2.0-or-later" path=".*" rule="may" group="defaultGroup" filefilter="gptcurses.h" desc=""/>
<policyitem type="license" name="GPLStyleLicense" path=".*" rule="may" group="defaultGroup" filefilter="support.h" desc=""/>
<policyitem type="license" name="InvalidLicense" path=".*" rule="may" group="defaultGroup" filefilter="GPL-2.0+" desc=""/>
<policyitem type="copyright" name="NULL" path=".*" rule="may" group="defaultGroup" filefilter="copyrightPolicyFilter" desc=""/>
</policy>
</policylist>
<filefilterlist>
<filefilter name="defaultFilter" desc="Files not to check">
<filteritem type="filename" name="README.OpenSource|README.Windows|README|Makefile.*|uninstall*" desc="NoLicenseHeader"/>
</filefilter>
<filefilter name="defaultPolicyFilter" desc="Filters for compatibilitylicense header policies">
</filefilter>
<filefilter name="copyrightPolicyFilter" desc="Filters for copyright header policies">
<filteritem type="filename" name="diskio*.*|gptpart.*|guid.*" desc="InvalidCopyright"/>
</filefilter>
<filefilter name="licenseFileNamePolicyFilter" desc="Filters for LICENSE file policies">
</filefilter>
<filefilter name="readmeFileNamePolicyFilter" desc="Filters for README file policies">
</filefilter>
<filefilter name="readmeOpenSourcefileNamePolicyFilter" desc="Filters for README.OpenSource file policies">
</filefilter>
<filefilter name="binaryFileTypePolicyFilter" desc="Filters for binary file policies">
</filefilter>
</filefilterlist>
<licensematcherlist>
<licensematcher name="GPL-2.0+" desc="License for file">
<licensetext name="
/*
* efone - Distributed internet phone system.
*
* (c) 1999,2000 Krzysztof Dabrowski
* (c) 1999,2000 ElysiuM deeZine
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
*/
" desc=""/>
<licensetext name="
//
// C++ Interface: GUIDData
//
// Description: GUIDData class header
// Implements the GUIDData data structure and support methods
//
//
// Author: Rod Smith &lt;rodsmith@rodsbooks.com&gt;, (C) 2010-2011
//
// Copyright: See COPYING file that comes with this distribution
//
//
" desc=""/>
</licensematcher>
</licensematcherlist>
</oatconfig>
</configuration>
+11
View File
@@ -0,0 +1,11 @@
[
{
"Name" : "gptfdisk",
"License" : "GPL-2.0-or-later",
"License File" : "COPYING",
"Version Number" : "1.0.5",
"Owner" : "Roderick W. Smith, rodsmith@rodsbooks.com",
"Upstream URL" : "https://sourceforge.net/projects/gptfdisk/files/gptfdisk/1.0.5/gptfdisk-1.0.5.tar.gz/download",
"Description" : "GPT fdisk is a disk partitioning tool loosely modeled on Linux fdisk, but used for modifying GUID Partition Table (GPT) disks. The related FixParts utility fixes some common problems on Master Boot Re"
}
]
+302
View File
@@ -0,0 +1,302 @@
# third_party_gptfdisk
GPT fdisk (aka gdisk, cgdisk, and sgdisk) and FixParts
by Roderick W. Smith, rodsmith@rodsbooks.com
#### Introduction
------------
This package includes the source code for four related disk partitioning
programs:
- gdisk -- This program is modeled after Linux fdisk, but it operates on
GUID Partition Table (GPT) disks rather than the Master Boot Record (MBR)
disks that fdisk modifies. As such, gdisk is an interactive text-mode
tool for manipulating partitions, but it does nothing to the contents of
those partitions (usually filesystems, but sometimes swap space or other
data).
- cgdisk -- This program is modeled after Linux cfdisk, but it operates on
GPT disks rather than the MBR disks that cfdisk modifies. As such, cgdisk
is a curses-based text-mode tool for manipulating partitions, which is to
say that it uses an interface that relies on arrow keys and a dynamic
display rather than the command letters and a scrolling display like
gdisk uses.
- sgdisk -- This program is conceptually similar to the Linux sfdisk and
FreeBSD gpt programs, but its operational details differ. It enables
manipulation of GPT disks using command-line options, so it's suitable
for use in scripts or by experts to perform specific tasks that might
take several commands in gdisk to accomplish.
- fixparts -- This program, unlike the preceding three, operates on MBR
disks. It's intended to fix certain problems that can be created by
various utilities. Specifically, it can fix mis-sized extended partitions
and primary partitions located in the middle of extended partitions. It
also enables changing primary vs. logical partition status (within limits
of what's legal in the MBR scheme) and making a few other minor changes.
It does NOT support creating new partitions; for that, you should use
fdisk, parted, or some other tool.
#### More details about the abilities of these tools follows.
All four programs rely on the same set of underlying code base; they differ
only in their control interfaces (defined in gdisk.cc, cgdisk.cc,
sgdisk.cc, and fixparts.cc, respectively) and in which support code they
use.
#### GPT fdisk (gdisk, cgdisk, and sgdisk) Details
---------------------------------------------
The gdisk program is intended as a (somewhat) fdisk-workalike program for
GPT-partitioned disks, cgdisk is similarly a workalike for fdisk, and
sgdisk provides most of gdisk's functionality in a more script-friendly
program. Although libparted and programs that use it (GNU Parted, gparted,
etc.) provide the ability to handle GPT disks, they have certain
limitations that gdisk overcomes. Specific advantages of gdisk, cgdisk, and
sgdisk include:
* The ability to convert MBR-partitioned disks in-place to GPT format,
without losing data
* The ability to convert BSD disklabels in-place to create GPT
partitions, without losing data
* The ability to convert from GPT format to MBR format without data loss
(gdisk and sgdisk only)
* More flexible specification of filesystem type code GUIDs, which
GNU Parted tends to corrupt
* Clear identification of the number of unallocated sectors on a
disk
* A user interface that's familiar to long-time users of Linux
fdisk and cfdisk (gdisk and cgdisk only)
* The MBR boot loader code is left alone
* The ability to create a hybrid MBR, which permits GPT-unaware OSes to
access up to three GPT partitions on the disk (gdisk and sgdisk only)
Of course, GPT fdisk isn't without its limitations. Most notably, it lacks
the filesystem awareness and filesystem-related features of GParted. You
can't resize a partition's filesystem or create a partition with a
filesystem already in place with gdisk, for instance. There's no GUI
version of gdisk.
The GPT fdisk package provides three program files: the interactive
text-mode gdisk, the curses-based interactive cgdisk, and the
command-line-driven sgdisk. The first two are intended for use in manually
partitioning disks or changing partitioning details; sgdisk is intended for
use in scripts to help automate tasks such as disk cloning or preparing
multiple disks for Linux installation.
1. xxxx
2. xxxx
3. xxxx
#### FixParts Details
----------------
This program's creation was motivated by cries for help I've seen in online
forums from users who have found their partition tables to be corrupted by
various buggy partitioning tools. Although most OSes can handle the
afflicted disks fine, libparted-based tools (GParted, parted, most Linux
installers, etc.) tend to flake out when presented with these disks.
Typically, the symptom is a disk that appears to hold no partitions;
however, sometimes the libparted tool presents partitions other than those
that the OS sees.
I've observed four causes of these symptoms, three of which FixParts can
correct:
* Old GPT data -- If a disk is used as a GPT disk and then re-used as an
MBR disk, the GPT data may be incompletely erased. This happens if the
disk is repartitioned with fdisk or the Microsoft Windows installer, for
instance. (Tools based on libparted correctly remove the old GPT data
when converting from GPT to MBR format.) FixParts checks for this problem
when it starts and offers to correct it. If you opt to erase the GPT
data, this erasure occurs immediately, unlike other changes the program
makes.
* Mis-sized extended partitions -- Some tools create an extended partition
that's too large, typically ending after the last sector of the disk.
FixParts automatically corrects this problem (if you use the 'w' option
to save the partition table).
* Primary partitions inside an extended partition -- Some utilities create
or move primary partitions to within the range covered by the extended
partition. FixParts can usually correct this problem by turning the
primary partition into a logical partition or by changing one or more
other logical partitions into primaries. Such corrections aren't always
possible, though, at least not without deleting or resizing other
partitions.
* Leftover RAID data -- If a disk is used in a RAID array and then re-used
as a non-RAID disk, some utilities can become confused and fail to see
the disk. FixParts can NOT correct this problem. You must destroy the old
RAID data, or possibly remove the dmraid package from the system, to fix
this problem.
When run, FixParts presents an fdisk-like interface, enabling you to adjust
partition types (primary, logical, or omitted), change type codes, change
the bootable flag, and so on. Although you can delete a partition (by
omitting it), you can't create new partitions with the program. If you're
used to partitioning disks, particularly with Linux fdisk, two unusual
features of FixParts require elaboration:
* No extended partitions -- Internally, FixParts reads the partition table
and discards data on any extended partition(s) it finds. When you save
the partition table, the program generates a new extended partition. This
design means that the program automatically corrects many problems
related to the extended partition. It also means that you'll see no
evidence of extended partitions in the FixParts user interface, although
it keeps track of the requirements and prevents you from creating illegal
layouts, such as a primary between two logicals.
* Partition numbering -- In most Linux tools, partitions 1-4 are primaries
and partitions 5 and up are logicals. Although a legal partition table
loaded into FixParts will initially conform to this convention, some
types of damaged table might not, and various changes you make can also
cause deviations. When FixParts writes the partition table, its numbering
will be altered to conform to the standard MBR conventions, but you
should use the explicit labeling of partitions as primary or logical
rather than the partition numbers to determine a partition's status.
1. xxxx
2. xxxx
3. xxxx
#### Installing
----------
To compile GPT fdisk, you must have appropriate development tools
installed, most notably the GNU Compiler Collection (GCC) and its g++
compiler for C++. I've also tested compilation with Clang, which seems to
work; however, I've not done extensive testing of the resulting binaries,
beyond checking a few basics. Under Windows, Microsoft Visual C++ 2008 can
be used instead. In addition, note these requirements:
* On Linux, FreeBSD, OS X, and Solaris, libuuid must be installed. This is
the standard for Linux and OS X, although you may need to install a
package called uuid-dev or something similar to get the headers. On
FreeBSD, the e2fsprogs-libuuid port must be installed.
* The ICU library (http://site.icu-project.org), which provides support for
Unicode partition names, is optional on all platforms except Windows, on
which it's not supported. Using this library was required to get proper
UTF-16 partition name support in GPT fdisk versions prior to 0.8.9, but
as of that version it should not longer be required. Nonetheless, you can
use it if you're having problems with the new UTF-16 support. This
library is normally installed in Linux and OS X, but you may need to
install the development headers (libicu-dev or something similar in
Linux; or the libicu36-dev Fink package in OS X). To compile with ICU
support, you must modify the Makefile: Look for commented-out lines that
refer to USE_UTF16, -licuuc, -licudata, or -licucore. Uncomment them and
comment out the equivalents that lack these lines.
* The cgdisk program requires the ncurses library and its development files
(headers). Most Linux distributions install ncurses by default, but you
may need to install a package called libncurses5-dev, ncurses-devel, or
something similar to obtain the header files. These files were installed
already on my Mac OS X development system; however, they may have been
installed as dependencies of other programs I've installed. If you're
having problems installing ncurses, you can compile gdisk and/or sgdisk
without cgdisk by specifying only the targets you want to compile to
make.
* The sgdisk program requires the popt library and its development files
(headers). Most Linux distributions install popt by default, but you may
need to install a package called popt-dev, popt-devel, or something
similar to obtain the header files. Mac OS users can find a version of
popt for Mac OS from Darwin Ports (http://popt.darwinports.com), MacPorts
(https://trac.macports.org/browser/trunk/dports/devel/popt/Portfile), Fink
(http://www.finkproject.org), or brew (http://macappstore.org/popt/);
however, you'll first need to install the relevant environment
(instructions exist on the relevant projects' pages). When I re-built my
Mac build environment in February of 2020, I found that brew was, by far,
the easiest of these to install. Some of the others seem to have been
abandoned, but I didn't investigate thoroughly. I'm leaving the references
in case they might be useful in the future. Instead of installing one of
These ports, you can compile gdisk and/or cgdisk alone, without sgdisk;
gdisk and cgdisk don't require popt.
When all the necessary development tools and libraries are installed, you
can uncompress the package and type "make" at the command prompt in the
resulting directory. (You may need to type "make -f Makefile.mac" on Mac OS
X, "make -f Makefile.freebsd" on FreeBSD, "make -f Makefile.solaris" on
Solaris, or "make -f Makefile.mingw" to compile using MinGW for Windows.)
You may also need to add header (include) directories or library
directories by setting the CXXFLAGS environment variable or by editing the
Makefile. The result should be program files called gdisk, cgdisk, sgdisk,
and fixparts. Typing "make gdisk", "make cgdisk", "make sgdisk", or "make
fixparts" will compile only the requested programs. You can use these
programs in place or copy the files to a suitable directory, such as
/usr/local/sbin. You can copy the man pages (gdisk.8, cgdisk.8, sgdisk.8,
and fixparts.8) to /usr/local/man/man8 to make them available.
1. Fork the repository
2. Create Feat_xxx branch
3. Commit your code
4. Create Pull Request
#### Caveats
-------
THIS SOFTWARE IS BETA SOFTWARE! IF IT WIPES OUT YOUR HARD DISK OR EATS YOUR
CAT, DON'T BLAME ME! To date, I've tested the software on several USB flash
drives, physical hard disks, and virtual disks in the QEMU and VirtualBox
environments. Many others have now used the software on their computers, as
well. I believe all data-corruption bugs to be squashed, but I know full well
that the odds of my missing something are high. This is particularly true for
large (over-2TiB) drives; my only direct testing with such disks is with
virtual QEMU and VirtualBox disks. I've received user reports of success with
RAID arrays over 2TiB in size, though.
My main development platform is a system running the 64-bit version of
Ubuntu Linux. I've also tested on several other 32- and 64-bit Linux
distributions, Intel-based Mac OS X 10.6 and several later versions, 64-bit
FreeBSD 7.1, and Windows 7 and 10.
1. Fork the repository
2. Create Feat_xxx branch
3. Commit your code
4. Create Pull Request
#### Redistribution
--------------
This program is licensed under terms of the GNU GPL (see the file COPYING).
1. Fork the repository
2. Create Feat_xxx branch
3. Commit your code
4. Create Pull Request
#### Acknowledgements
----------------
This code is mostly my own; however, I've used three functions from two
other GPLed programs:
- The code used to generate CRCs is taken from the efone program by
Krzysztof Dabrowski and ElysiuM deeZine. (See the crc32.h and
crc32.cc source code files.)
- A function to find the disk size is taken from Linux fdisk by A. V. Le
Blanc. This code has subsequently been heavily modified.
Additional code contributors include:
- Yves Blusseau (1otnwmz02@sneakemail.com)
- David Hubbard (david.c.hubbard@gmail.com)
- Justin Maggard (justin.maggard@netgear.com)
- Dwight Schauer (dschauer@ti.com)
- Florian Zumbiehl (florz@florz.de)
- Guillaume Delacour (contributed the gdisk_test.sh script)
1. Fork the repository
2. Create Feat_xxx branch
3. Commit your code
4. Create Pull Request
+2
View File
@@ -7,7 +7,9 @@
under the terms of the GNU GPL version 2, as detailed in the COPYING file. */
#define __STDC_LIMIT_MACROS
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#include <stdint.h>
#include <stdio.h>
+2
View File
@@ -7,7 +7,9 @@
under the terms of the GNU GPL version 2, as detailed in the COPYING file. */
#define __STDC_LIMIT_MACROS
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#include <stdio.h>
#include <stdlib.h>
+2
View File
@@ -7,7 +7,9 @@
under the terms of the GNU GPL version 2, as detailed in the COPYING file. */
#define __STDC_LIMIT_MACROS
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#include <stdio.h>
//#include <unistd.h>
+2
View File
@@ -13,7 +13,9 @@
// under the terms of the GNU GPL version 2, as detailed in the COPYING file.
#define __STDC_LIMIT_MACROS
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#include <sys/ioctl.h>
#include <string.h>
+2
View File
@@ -13,7 +13,9 @@
// under the terms of the GNU GPL version 2, as detailed in the COPYING file.
#define __STDC_LIMIT_MACROS
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#include <windows.h>
#include <winioctl.h>
+2
View File
@@ -13,7 +13,9 @@
// under the terms of the GNU GPL version 2, as detailed in the COPYING file.
#define __STDC_LIMIT_MACROS
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#ifdef _WIN32
#include <windows.h>
+2
View File
@@ -7,7 +7,9 @@
under the terms of the GNU GPL version 2, as detailed in the COPYING file. */
#define __STDC_LIMIT_MACROS
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#include <stdio.h>
#include <stdlib.h>
+2
View File
@@ -13,7 +13,9 @@
// under the terms of the GNU GPL version 2, as detailed in the COPYING file.
#define __STDC_LIMIT_MACROS
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#ifdef USE_UTF16
#include <unicode/ustdio.h>
+2
View File
@@ -12,7 +12,9 @@
//
#define __STDC_LIMIT_MACROS
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#include <stdio.h>
#include <time.h>
+2
View File
@@ -7,7 +7,9 @@
under the terms of the GNU GPL version 2, as detailed in the COPYING file. */
#define __STDC_LIMIT_MACROS
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#include <stdio.h>
#include <stdlib.h>
+2
View File
@@ -18,7 +18,9 @@
*/
#define __STDC_LIMIT_MACROS
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#include <stddef.h>
#include <stdint.h>
+2
View File
@@ -6,7 +6,9 @@
under the terms of the GNU GPL version 2, as detailed in the COPYING file. */
#define __STDC_LIMIT_MACROS
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#include <string.h>
#include <stdint.h>
+4
View File
@@ -7,8 +7,12 @@
under the terms of the GNU GPL version 2, as detailed in the COPYING file. */
#define __STDC_LIMIT_MACROS
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif
#include <inttypes.h>
#include <stdio.h>