mirror of
https://github.com/TREX-CoE/qmckl.git
synced 2024-11-19 12:32:40 +01:00
Initial commit : context
This commit is contained in:
parent
6c9ab49366
commit
6e18f16b82
3
src/.gitignore
vendored
Normal file
3
src/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
*.o
|
||||
*.c
|
||||
*.h
|
11
src/Makefile
Normal file
11
src/Makefile
Normal file
@ -0,0 +1,11 @@
|
||||
CC=gcc
|
||||
CFLAGS=
|
||||
|
||||
SOURCE_FILES=$(wildcard *.org)
|
||||
|
||||
%.o: %.c.org
|
||||
- emacs --quick --no-init-file --batch --eval "(require 'org)" --eval '(org-babel-tangle-file "$^")'
|
||||
- $(CC) $(CFLAGS) -c $*.c -o $@
|
||||
- rm -f $*.c $*.h
|
||||
|
||||
|
12
src/README.org
Normal file
12
src/README.org
Normal file
@ -0,0 +1,12 @@
|
||||
Source files are written in org-mode format, to provide useful comments and
|
||||
LaTex formulas around the code.
|
||||
|
||||
The code is extracted from the org files using Emacs in the `Makefile`, and
|
||||
then he produced files are compiled.
|
||||
|
||||
For a better experience, editing can be done with Emacs. Note that Emacs can
|
||||
behave like Vim when switched into ``Evil'' mode.
|
||||
|
||||
|
||||
|
||||
|
126
src/qmckl_context.c.org
Normal file
126
src/qmckl_context.c.org
Normal file
@ -0,0 +1,126 @@
|
||||
# -*- mode: org -*-
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.c
|
||||
#include <stdlib.h> /* malloc */
|
||||
#include "qmckl_context.h"
|
||||
#+END_SRC
|
||||
|
||||
* Context
|
||||
|
||||
The context variable is a handle for the state of the library, and
|
||||
is stored in the following data structure, which can't be seen
|
||||
outside of the library.
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.h
|
||||
#define QMCKL_DEFAULT_PRECISION 53
|
||||
#define QMCKL_DEFAULT_RANGE 2
|
||||
|
||||
typedef long int qmckl_context ;
|
||||
#+END_SRC
|
||||
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.c
|
||||
typedef struct qmckl_context_struct_ {
|
||||
struct qmckl_context_struct_ * prev;
|
||||
int precision;
|
||||
int range;
|
||||
} qmckl_context_struct;
|
||||
#+END_SRC
|
||||
|
||||
To create a new context, use =qmckl_context_create()=. If the creation
|
||||
failed, the function returns 0. On success, a pointer to a context
|
||||
is returned as a long integer.
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.h
|
||||
qmckl_context qmckl_context_create();
|
||||
#+END_SRC
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.c
|
||||
qmckl_context qmckl_context_create() {
|
||||
|
||||
qmckl_context_struct* context;
|
||||
|
||||
context = (qmckl_context_struct*) malloc (sizeof(qmckl_context_struct));
|
||||
if (context == NULL) {
|
||||
return (qmckl_context) 0;
|
||||
}
|
||||
|
||||
context->prev = NULL;
|
||||
context->precision = QMCKL_DEFAULT_PRECISION;
|
||||
context->range = QMCKL_DEFAULT_RANGE;
|
||||
|
||||
return (qmckl_context) context;
|
||||
}
|
||||
#+END_SRC
|
||||
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.h
|
||||
qmckl_context qmckl_context_copy(qmckl_context context);
|
||||
#+END_SRC
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.c
|
||||
qmckl_context qmckl_context_copy(qmckl_context context) {
|
||||
|
||||
qmckl_context_struct* old_context;
|
||||
qmckl_context_struct* new_context;
|
||||
|
||||
new_context = (qmckl_context_struct*) malloc (sizeof(qmckl_context_struct));
|
||||
if (new_context == NULL) {
|
||||
return (qmckl_context) 0;
|
||||
}
|
||||
|
||||
old_context = (qmckl_context_struct*) context;
|
||||
|
||||
new_context->prev = old_context;
|
||||
new_context->precision = old_context->precision;
|
||||
new_context->range = old_context->range;
|
||||
|
||||
return (qmckl_context) new_context;
|
||||
}
|
||||
#+END_SRC
|
||||
|
||||
|
||||
* Precision
|
||||
|
||||
The following functions set the expected required precision and range.
|
||||
=precision= should be an integer between 2 and 53, and =range= should be
|
||||
an integer between 2 and 11.
|
||||
These functions return 0 upon success.
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.h
|
||||
qmckl_context qmckl_context_set_precision(qmckl_context context, int precision);
|
||||
#+END_SRC
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.c
|
||||
qmckl_context qmckl_context_set_precision(qmckl_context context, int precision) {
|
||||
qmckl_context_struct* ctx;
|
||||
|
||||
if (precision < 2) return (qmckl_context) 0;
|
||||
if (precision > 53) return (qmckl_context) 0;
|
||||
|
||||
ctx = (qmckl_context_struct*) qmckl_context_copy(context);
|
||||
ctx->precision = precision;
|
||||
return (qmckl_context) ctx;
|
||||
}
|
||||
#+END_SRC
|
||||
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.h
|
||||
qmckl_context qmckl_context_set_range(qmckl_context context, int range);
|
||||
#+END_SRC
|
||||
|
||||
#+BEGIN_SRC C :tangle qmckl_context.c
|
||||
qmckl_context qmckl_context_set_range(qmckl_context context, int range) {
|
||||
qmckl_context_struct* ctx;
|
||||
|
||||
if (range < 2) return (qmckl_context) 0;
|
||||
if (range > 11) return (qmckl_context) 0;
|
||||
|
||||
ctx = (qmckl_context_struct*) qmckl_context_copy(context);
|
||||
ctx->range = range;
|
||||
return (qmckl_context) ctx;
|
||||
}
|
||||
#+END_SRC
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user