|
From: Vesa K. <ve...@ml...> - 2006-12-28 10:36:34
|
Initial commit of libc mlnlffi interface. There is still much to do (perhaps even including extensions to mlnlffigen). ---------------------------------------------------------------------- A mltonlib/trunk/org/mlton/vesak/ A mltonlib/trunk/org/mlton/vesak/libc/ A mltonlib/trunk/org/mlton/vesak/libc/unstable/ A mltonlib/trunk/org/mlton/vesak/libc/unstable/LICENSE A mltonlib/trunk/org/mlton/vesak/libc/unstable/Makefile A mltonlib/trunk/org/mlton/vesak/libc/unstable/README A mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/ A mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/c/ A mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/c/stdio.c A mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/c/util.h A mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/config-gen.c A mltonlib/trunk/org/mlton/vesak/libc/unstable/libc.mlb A mltonlib/trunk/org/mlton/vesak/libc/unstable/public/ A mltonlib/trunk/org/mlton/vesak/libc/unstable/public/common.h A mltonlib/trunk/org/mlton/vesak/libc/unstable/public/stdio.h ---------------------------------------------------------------------- Property changes on: mltonlib/trunk/org/mlton/vesak/libc/unstable ___________________________________________________________________ Name: svn:ignore + *.a .* generated Added: mltonlib/trunk/org/mlton/vesak/libc/unstable/LICENSE =================================================================== --- mltonlib/trunk/org/mlton/vesak/libc/unstable/LICENSE 2006-12-28 14:26:15 UTC (rev 4999) +++ mltonlib/trunk/org/mlton/vesak/libc/unstable/LICENSE 2006-12-28 18:36:31 UTC (rev 5000) @@ -0,0 +1,20 @@ +COPYRIGHT NOTICE, LICENSE AND DISCLAIMER. + +Copyright (C) 2006 Vesa Karvonen + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both the copyright notice and this permission notice and warranty +disclaimer appear in supporting documentation, and that the name of +the above copyright holders, or their entities, not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. + +The above copyright holders disclaim all warranties with regard to +this software, including all implied warranties of merchantability and +fitness. In no event shall the above copyright holders be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether in an +action of contract, negligence or other tortious action, arising out +of or in connection with the use or performance of this software. Added: mltonlib/trunk/org/mlton/vesak/libc/unstable/Makefile =================================================================== --- mltonlib/trunk/org/mlton/vesak/libc/unstable/Makefile 2006-12-28 14:26:15 UTC (rev 4999) +++ mltonlib/trunk/org/mlton/vesak/libc/unstable/Makefile 2006-12-28 18:36:31 UTC (rev 5000) @@ -0,0 +1,56 @@ +# Copyright (C) 2006 Vesa Karvonen +# +# This code is released under the MLton license, a BSD-style license. +# See the LICENSE file or http://mlton.org/License for details. + +target_arch := $(shell mlton -show-path-map true | \ + awk '/^TARGET_ARCH/ {print $$2}') +target_os := $(shell mlton -show-path-map true | \ + awk '/^TARGET_OS/ {print $$2}') +target_id := $(target_arch)-$(target_os) + +lib_file := libc-nlffi-$(target_id).a +mlb_file := libc.mlb + +config_h := public/config-$(target_id).h +cc_opts := -Wall -std=c99 + +bin_dir := .bin/$(target_id) +gen_dir := generated/$(target_id) + +c_dir := detail/c +c_files := $(wildcard $(c_dir)/*.c) +o_files := $(patsubst $(c_dir)/%.c,$(bin_dir)/%.o,$(c_files)) + +.PHONY : all clean help + +help : + @echo "Targets:" + @echo " all Builds the library ($(lib_file)) and NLFFI files" + @echo " clean Removes generated files" + @echo " help Prints this message" + +all : $(gen_dir)/$(mlb_file) $(lib_file) + +clean : + rm -rf $(gen_dir) $(bin_dir) $(config_h) $(lib_file) + +$(config_h) : detail/config-gen.c + mkdir -p $(bin_dir) + gcc $(cc_opts) -o $(bin_dir)/config-gen $< + $(bin_dir)/config-gen > $@ + +$(gen_dir)/$(mlb_file) : $(config_h) $(wildcard public/*.h) + mkdir -p $(gen_dir) + mlnlffigen -dir $(gen_dir) \ + -mlbfile $(mlb_file) \ + -cppopt '-U$(target_arch) -DTARGET_ARCH=$(target_arch)' \ + -cppopt '-U$(target_os) -DTARGET_OS=$(target_os)' \ + -linkage static $^ + +$(lib_file) : $(o_files) + ar cr $@ $^ + +$(bin_dir)/%.o : $(c_dir)/%.c + mkdir -p $(bin_dir) + gcc $(cc_opts) -c -o $@ $< Property changes on: mltonlib/trunk/org/mlton/vesak/libc/unstable/Makefile ___________________________________________________________________ Name: svn:eol-style + native Added: mltonlib/trunk/org/mlton/vesak/libc/unstable/README =================================================================== --- mltonlib/trunk/org/mlton/vesak/libc/unstable/README 2006-12-28 14:26:15 UTC (rev 4999) +++ mltonlib/trunk/org/mlton/vesak/libc/unstable/README 2006-12-28 18:36:31 UTC (rev 5000) @@ -0,0 +1,61 @@ +LibC MLNLFFI Interface +---------------------- + + This library provides a MLNLFFI interface to (some portions of) the C + standard library (libc). + + +Info +---- + + License: MLton license (a BSD-style license) + Portability: portable + Stability: experimental + Maintainer: Vesa Karvonen <ves...@cs...> + + +About Library Organization +-------------------------- + + Makefile + + This is a GNU makefile for building the library. It is designed to + allow a single source tree to be built on multiple platforms. Run + the command + + make + + to see a list of supported targets. + + libc-nlffi-$(TARGET_ARCH)-$(TARGET_OS).a + + This library contains the C compiled part of the libc interface. + You need to link your program against this library. The variables + TARGET_ARCH and TARGET_OS refer to the corresponding variables as + defined by the compiler. For example, with the mlton compiler + running the command + + mlton -show-path-map true | grep TARGET + + shows the variables. + + public/ + + This directory contains the public header files used as source files + to mlnlffigen. + + libc.mlb + + This the MLB-file for the SML part of the libc interface. + + detail/ + + This directory contains the implementation details of the library. + + +About Motivation and Scope +-------------------------- + + The main motivation of this library is to make it easier to implement + bindings to C libraries. This library should eventually include all + parts of libc that make sense from that perspective. Added: mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/c/stdio.c =================================================================== --- mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/c/stdio.c 2006-12-28 14:26:15 UTC (rev 4999) +++ mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/c/stdio.c 2006-12-28 18:36:31 UTC (rev 5000) @@ -0,0 +1,25 @@ +/* Copyright (C) 2006 Vesa Karvonen + * + * This code is released under the MLton license, a BSD-style license. + * See the LICENSE file or http://mlton.org/License for details. + */ + +#include <stdio.h> +#include "util.h" + +CONSTANT(int, EOF) +CONSTANT(int, FILENAME_MAX) +CONSTANT(int, FOPEN_MAX) +CONSTANT(int, L_tmpnam) +CONSTANT(int, SEEK_CUR) +CONSTANT(int, SEEK_END) +CONSTANT(int, SEEK_SET) +CONSTANT(int, TMP_MAX) +CONSTANT(int, _IOFBF) +CONSTANT(int, _IOLBF) +CONSTANT(int, _IONBF) +CONSTANT(size_t, BUFSIZ) + +CONST_FN(FILE *, stderr) +CONST_FN(FILE *, stdin) +CONST_FN(FILE *, stdout) Property changes on: mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/c/stdio.c ___________________________________________________________________ Name: svn:eol-style + native Added: mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/c/util.h =================================================================== --- mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/c/util.h 2006-12-28 14:26:15 UTC (rev 4999) +++ mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/c/util.h 2006-12-28 18:36:31 UTC (rev 5000) @@ -0,0 +1,8 @@ +/* Copyright (C) 2006 Vesa Karvonen + * + * This code is released under the MLton license, a BSD-style license. + * See the LICENSE file or http://mlton.org/License for details. + */ + +#define CONSTANT(type, name) const type name##_ = name; +#define CONST_FN(type, name) type name##_(void) {return name;} Property changes on: mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/c/util.h ___________________________________________________________________ Name: svn:eol-style + native Added: mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/config-gen.c =================================================================== --- mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/config-gen.c 2006-12-28 14:26:15 UTC (rev 4999) +++ mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/config-gen.c 2006-12-28 18:36:31 UTC (rev 5000) @@ -0,0 +1,161 @@ +/* Copyright (C) 2006 Vesa Karvonen + * + * This code is released under the MLton license, a BSD-style license. + * See the LICENSE file or http://mlton.org/License for details. + */ + +/* This simple C program is used to generate a configuration header that + * defines typedefs for standard types and typedefs. For each type[def], + * this program simply chooses a type that has the correct size and kind + * (signed or unsigned integer). The reason for doing this is that system + * and/or compiler headers may (and often do) contain non-standard C and + * choke mlnlffigen. Also, mlnlffigen can't export macros, so we need to + * do something about them. So, instead of #including system headers, we + * make our own headers. + */ + +#include <stdarg.h> +#include <stdbool.h> +#include <stddef.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/************************************************************************/ + +static void +fail(const char *format, ...) { + va_list args; + va_start(args, format); + fprintf(stderr, "Error: "); + vfprintf(stderr, format, args); + fprintf(stderr, "\n"); + va_end(args); + exit(EXIT_FAILURE); +} + +#define fail(...) do fail(__VA_ARGS__); while (true) + +/************************************************************************/ + +typedef enum integer_kind { + signed_integer, + unsigned_integer +} integer_kind; + +static const char * +choose_integer_type(const size_t size, const integer_kind kind) { + switch (kind) { + case signed_integer: + if (sizeof(signed char) == size) return "signed char"; + if (sizeof(short) == size) return "short"; + if (sizeof(int) == size) return "int"; + if (sizeof(long) == size) return "long"; + if (sizeof(long long) == size) return "long long"; + break; + case unsigned_integer: + if (sizeof(unsigned char) == size) return "unsigned char"; + if (sizeof(unsigned short) == size) return "unsigned short"; + if (sizeof(unsigned int) == size) return "unsigned int"; + if (sizeof(unsigned long) == size) return "unsigned long"; + if (sizeof(unsigned long long) == size) return "unsigned long long"; + break; + } + fail("Couldn't find a %s type of %zd bytes.", + signed_integer == kind ? "signed" : "unsigned", + size); +} + +/************************************************************************/ + +static void +print_header(void) { + printf("#ifndef CONFIG_H\n" + "#define CONFIG_H\n" + "\n" + "/* THIS FILE IS GENERATED. DO NOT EDIT! */\n"); +} + +static void +print_separator(const char *text) { + printf("\n/** <%s> *", text); + for (size_t width = strlen(text) + strlen("/** <> *"); width < 72; ++width) + printf("*"); + printf("*/\n\n"); +} + +static void +print_integer_type(const size_t size, + const integer_kind kind, + const char *name) { + printf("typedef %s %s;\n", choose_integer_type(size, kind), name); +} + +static void +print_footer(void) { + printf("\n" + "#endif\n"); +} + +/************************************************************************/ + +#define INTEGER_TYPE(type) \ +print_integer_type(sizeof(type), \ + (type)-1 < (type)0 \ + ? signed_integer \ + : unsigned_integer, \ + #type) + +int +main(int argc, char *argv[]) { + print_header(); + + print_separator("stdbool.h"); + + INTEGER_TYPE(bool); + + print_separator("stddef.h"); + + INTEGER_TYPE(size_t); + INTEGER_TYPE(ptrdiff_t); + + print_separator("stdint.h"); + + INTEGER_TYPE(int8_t); + INTEGER_TYPE(int16_t); + INTEGER_TYPE(int32_t); + INTEGER_TYPE(int64_t); + INTEGER_TYPE(uint8_t); + INTEGER_TYPE(uint16_t); + INTEGER_TYPE(uint32_t); + INTEGER_TYPE(uint64_t); + INTEGER_TYPE(int_least8_t); + INTEGER_TYPE(int_least16_t); + INTEGER_TYPE(int_least32_t); + INTEGER_TYPE(int_least64_t); + INTEGER_TYPE(uint_least8_t); + INTEGER_TYPE(uint_least16_t); + INTEGER_TYPE(uint_least32_t); + INTEGER_TYPE(uint_least64_t); + INTEGER_TYPE(int_fast8_t); + INTEGER_TYPE(int_fast16_t); + INTEGER_TYPE(int_fast32_t); + INTEGER_TYPE(int_fast64_t); + INTEGER_TYPE(uint_fast8_t); + INTEGER_TYPE(uint_fast16_t); + INTEGER_TYPE(uint_fast32_t); + INTEGER_TYPE(uint_fast64_t); + INTEGER_TYPE(intptr_t); + INTEGER_TYPE(uintptr_t); + INTEGER_TYPE(intmax_t); + INTEGER_TYPE(uintmax_t); + + print_separator("wchar.h"); + + INTEGER_TYPE(wchar_t); + + print_footer(); + + return EXIT_SUCCESS; +} Property changes on: mltonlib/trunk/org/mlton/vesak/libc/unstable/detail/config-gen.c ___________________________________________________________________ Name: svn:eol-style + native Added: mltonlib/trunk/org/mlton/vesak/libc/unstable/libc.mlb =================================================================== --- mltonlib/trunk/org/mlton/vesak/libc/unstable/libc.mlb 2006-12-28 14:26:15 UTC (rev 4999) +++ mltonlib/trunk/org/mlton/vesak/libc/unstable/libc.mlb 2006-12-28 18:36:31 UTC (rev 5000) @@ -0,0 +1,7 @@ +(* Copyright (C) 2006 Vesa Karvonen + * + * This code is released under the MLton license, a BSD-style license. + * See the LICENSE file or http://mlton.org/License for details. + *) + +generated/$(TARGET_ARCH)-$(TARGET_OS)/libc.mlb Property changes on: mltonlib/trunk/org/mlton/vesak/libc/unstable/libc.mlb ___________________________________________________________________ Name: svn:eol-style + native Property changes on: mltonlib/trunk/org/mlton/vesak/libc/unstable/public ___________________________________________________________________ Name: svn:ignore + config-*-*.h Added: mltonlib/trunk/org/mlton/vesak/libc/unstable/public/common.h =================================================================== --- mltonlib/trunk/org/mlton/vesak/libc/unstable/public/common.h 2006-12-28 14:26:15 UTC (rev 4999) +++ mltonlib/trunk/org/mlton/vesak/libc/unstable/public/common.h 2006-12-28 18:36:31 UTC (rev 5000) @@ -0,0 +1,21 @@ +#ifndef COMMON_H +#define COMMON_H + +/* Copyright (C) 2006 Vesa Karvonen + * + * This code is released under the MLton license, a BSD-style license. + * See the LICENSE file or http://mlton.org/License for details. + */ + +#if !defined(TARGET_ARCH) || !defined(TARGET_OS) +#error TARGET_ARCH and TARGET_OS must be defined +#endif + +#define STRINGIFY(x) STRINGIFY_DELAY(x) +#define STRINGIFY_DELAY(x) #x + +#include STRINGIFY(config-TARGET_ARCH-TARGET_OS.h) + +#define restrict /* mlnlffigen can't parse restrict ATM */ + +#endif Property changes on: mltonlib/trunk/org/mlton/vesak/libc/unstable/public/common.h ___________________________________________________________________ Name: svn:eol-style + native Added: mltonlib/trunk/org/mlton/vesak/libc/unstable/public/stdio.h =================================================================== --- mltonlib/trunk/org/mlton/vesak/libc/unstable/public/stdio.h 2006-12-28 14:26:15 UTC (rev 4999) +++ mltonlib/trunk/org/mlton/vesak/libc/unstable/public/stdio.h 2006-12-28 18:36:31 UTC (rev 5000) @@ -0,0 +1,80 @@ +#ifndef STDIO_H +#define STDIO_H + +/* Copyright (C) 2006 Vesa Karvonen + * + * This code is released under the MLton license, a BSD-style license. + * See the LICENSE file or http://mlton.org/License for details. + */ + +#include "common.h" + +typedef struct FILE FILE; +typedef struct fpos_t fpos_t; + +extern const int EOF_; +extern const int FILENAME_MAX_; +extern const int FOPEN_MAX_; +extern const int L_tmpnam_; +extern const int SEEK_CUR_; +extern const int SEEK_END_; +extern const int SEEK_SET_; +extern const int TMP_MAX_; +extern const int _IOFBF_; +extern const int _IOLBF_; +extern const int _IONBF_; +extern const size_t BUFSIZ_; + +FILE *stderr_(void); +FILE *stdin_(void); +FILE *stdout_(void); + +int remove(const char *filename); +int rename(const char *old, const char *new); +FILE *tmpfile(void); +char *tmpnam(char *s); +int fclose(FILE *stream); +int fflush(FILE *stream); +FILE *fopen(const char * restrict filename, const char * restrict mode); +FILE *freopen(const char * restrict filename, const char * restrict mode, +FILE * restrict stream); +void setbuf(FILE * restrict stream, char * restrict buf); +int setvbuf(FILE * restrict stream, char * restrict buf, int mode, size_t size); +/* int fprintf(FILE * restrict stream, const char * restrict format, ...); */ +/* int fscanf(FILE * restrict stream, const char * restrict format, ...); */ +/* int printf(const char * restrict format, ...); */ +/* int scanf(const char * restrict format, ...); */ +/* int snprintf(char * restrict s, size_t n, const char * restrict format, ...); */ +/* int sprintf(char * restrict s, const char * restrict format, ...); */ +/* int sscanf(const char * restrict s, const char * restrict format, ...); */ +/* int vfprintf(FILE * restrict stream, const char * restrict format, va_list arg); */ +/* int vfscanf(FILE * restrict stream, const char * restrict format, va_list arg); */ +/* int vprintf(const char * restrict format, va_list arg); */ +/* int vscanf(const char * restrict format, va_list arg); */ +/* int vsnprintf(char * restrict s, size_t n, const char * restrict format, va_list arg); */ +/* int vsprintf(char * restrict s, const char * restrict format, va_list arg); */ +/* int vsscanf(const char * restrict s, const char * restrict format, va_list arg); */ +int fgetc(FILE *stream); +char *fgets(char * restrict s, int n, FILE * restrict stream); +int fputc(int c, FILE *stream); +int fputs(const char * restrict s, FILE * restrict stream); +int getc(FILE *stream); +int getchar(void); +char *gets(char *s); +int putc(int c, FILE *stream); +int putchar(int c); +int puts(const char *s); +int ungetc(int c, FILE *stream); +size_t fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream); +size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream); +int fgetpos(FILE * restrict stream, fpos_t * restrict pos); +int fseek(FILE *stream, long int offset, int whence); +int fsetpos(FILE *stream, const fpos_t *pos); +long int ftell(FILE *stream); +void rewind(FILE *stream); +void clearerr(FILE *stream); +int feof(FILE *stream); +int ferror(FILE *stream); +void perror(const char *s); + +#endif Property changes on: mltonlib/trunk/org/mlton/vesak/libc/unstable/public/stdio.h ___________________________________________________________________ Name: svn:eol-style + native |