Added files which were forgotten with commit 32bfa95. Thanks Daniel Pielmeier.
This commit is contained in:
parent
1098709bf4
commit
9d20fbde69
@ -20,6 +20,8 @@
|
|||||||
|
|
||||||
- LinkiteM, PermiteM which temporarily record relations and states.
|
- LinkiteM, PermiteM which temporarily record relations and states.
|
||||||
|
|
||||||
|
- NumbermappeR which maps off_t numbers to other off_t numbers.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
@ -1082,3 +1084,330 @@ int Permstack_peek(struct PermiteM **o, struct PermiteM *stopper,
|
|||||||
|
|
||||||
/* ---------------------------- End PermstacK ----------------------------- */
|
/* ---------------------------- End PermstacK ----------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------------------------- NumbermappeR ----------------------------- */
|
||||||
|
|
||||||
|
struct NumbermappinG {
|
||||||
|
off_t from_low;
|
||||||
|
off_t from_high;
|
||||||
|
off_t to_low;
|
||||||
|
off_t to_high;
|
||||||
|
|
||||||
|
struct NumbermappinG *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
off_t Numbermapping__curb(off_t num, off_t min, off_t max, int flag)
|
||||||
|
{
|
||||||
|
if(num < min)
|
||||||
|
return(min);
|
||||||
|
if(num > max)
|
||||||
|
return(max);
|
||||||
|
return(num);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Numbermapping_new(struct NumbermappinG **o,
|
||||||
|
off_t from_low, off_t from_high,
|
||||||
|
off_t to_low, off_t to_high,
|
||||||
|
struct NumbermappinG *next,
|
||||||
|
off_t min, off_t max, int flag)
|
||||||
|
{
|
||||||
|
struct NumbermappinG *m;
|
||||||
|
|
||||||
|
m= TSOB_FELD(struct NumbermappinG, 1);
|
||||||
|
if(m == NULL)
|
||||||
|
return(-1);
|
||||||
|
m->from_low= Numbermapping__curb(from_low, min, max, 0);
|
||||||
|
m->from_high= Numbermapping__curb(from_high, min, max, 0);
|
||||||
|
m->to_low= Numbermapping__curb(to_low, min, max, 0);
|
||||||
|
m->to_high= Numbermapping__curb(to_high, min, max, 0);
|
||||||
|
m->next= next;
|
||||||
|
*o= m;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Numbermapping_destroy(struct NumbermappinG **o, int flag)
|
||||||
|
{
|
||||||
|
if(*o == NULL)
|
||||||
|
return(2);
|
||||||
|
free(*o);
|
||||||
|
*o= NULL;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Numbermapping_destroy_all(struct NumbermappinG **o, int flag)
|
||||||
|
{
|
||||||
|
struct NumbermappinG *m, *m_next;
|
||||||
|
|
||||||
|
if(*o == NULL)
|
||||||
|
return(2);
|
||||||
|
for(m= *o; m != NULL; m= m_next) {
|
||||||
|
m_next= m->next;
|
||||||
|
Numbermapping_destroy(&m, 0);
|
||||||
|
}
|
||||||
|
*o= NULL;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* @return 0=no match, 1=good mapping, 2=curbed mapping
|
||||||
|
*/
|
||||||
|
int Numbermapping_map(struct NumbermappinG *o, off_t from, off_t *to,
|
||||||
|
off_t min, off_t max, int flag)
|
||||||
|
{
|
||||||
|
struct NumbermappinG *m;
|
||||||
|
off_t diff;
|
||||||
|
|
||||||
|
if(from < min)
|
||||||
|
from= min;
|
||||||
|
else if(from > max)
|
||||||
|
from= max;
|
||||||
|
|
||||||
|
for(m= o; m != NULL; m= m->next) {
|
||||||
|
if(from > m->from_high || from < m->from_low)
|
||||||
|
continue;
|
||||||
|
diff= from - m->from_low;
|
||||||
|
if(m->to_low + diff > m->to_high) {
|
||||||
|
*to= m->to_high;
|
||||||
|
return(2);
|
||||||
|
} else {
|
||||||
|
*to= m->to_low + diff;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*to= from;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct NumbermappeR {
|
||||||
|
off_t min; /* lowest permissible number : - 2 exp 60 to + 2 exp 60 - 1 */
|
||||||
|
off_t max; /* highest permissible number : - 2 exp 60 to + 2 exp 60 - 1 */
|
||||||
|
|
||||||
|
int count; /* count of interval mappings */
|
||||||
|
struct NumbermappinG *mappings;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int Numbermapper_new(struct NumbermappeR **o, off_t min, off_t max, int flag)
|
||||||
|
{
|
||||||
|
struct NumbermappeR *m;
|
||||||
|
|
||||||
|
if(min < -(((off_t) 1) << 60) || min >= (((off_t) 1) << 60) ||
|
||||||
|
max < -(((off_t) 1) << 60) || max >= (((off_t) 1) << 60))
|
||||||
|
return(0);
|
||||||
|
if(min > max)
|
||||||
|
return(0);
|
||||||
|
m= TSOB_FELD(struct NumbermappeR, 1);
|
||||||
|
if(m == NULL)
|
||||||
|
return(-1);
|
||||||
|
m->min= min;
|
||||||
|
m->max= max;
|
||||||
|
m->count= 0;
|
||||||
|
m->mappings= NULL;
|
||||||
|
*o= m;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Numbermapper_destroy(struct NumbermappeR **o, int flag)
|
||||||
|
{
|
||||||
|
if(*o == NULL)
|
||||||
|
return(2);
|
||||||
|
Numbermapping_destroy_all(&((*o)->mappings), 0);
|
||||||
|
free(*o);
|
||||||
|
*o= NULL;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Numbermapper_add(struct NumbermappeR *o, off_t from_low, off_t from_high,
|
||||||
|
off_t to_low, off_t to_high, int flag)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
struct NumbermappinG *nm;
|
||||||
|
|
||||||
|
ret= Numbermapping_new(&nm, from_low, from_high, to_low, to_high,
|
||||||
|
o->mappings, o->min, o->max, 0);
|
||||||
|
if(ret <= 0)
|
||||||
|
return(ret);
|
||||||
|
o->count++;
|
||||||
|
o->mappings= nm;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Numbermapper_map(struct NumbermappeR *o, off_t from, off_t *to, int flag)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if(o == NULL) {
|
||||||
|
*to= from;
|
||||||
|
return(2);
|
||||||
|
}
|
||||||
|
ret= Numbermapping_map(o->mappings, from, to, o->min, o->max, 0);
|
||||||
|
if(ret <= 0)
|
||||||
|
return(ret);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
@param errmsg character array of at least size 80
|
||||||
|
@param flag bit0= accept end-of-text as separator
|
||||||
|
*/
|
||||||
|
int Numbermapper_decode_one(struct NumbermappeR *o, char *cpt, char separator,
|
||||||
|
off_t *num, char **separator_pos,
|
||||||
|
char *errmsg, int flag)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char *npt, num_text[32];
|
||||||
|
|
||||||
|
npt= strchr(cpt, separator);
|
||||||
|
if(npt == NULL) {
|
||||||
|
if(flag & 1) {
|
||||||
|
npt= cpt + strlen(cpt);
|
||||||
|
} else {
|
||||||
|
sprintf(errmsg, "Expected separator '%c'", separator);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*separator_pos= npt;
|
||||||
|
if(npt - cpt >= 32) {
|
||||||
|
sprintf(errmsg, "Number text is too long");
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
strncpy(num_text, cpt, npt - cpt);
|
||||||
|
num_text[npt - cpt]= 0;
|
||||||
|
ret= Sfile_text_to_off_t(num_text, num, 0);
|
||||||
|
if(ret <= 0) {
|
||||||
|
sprintf(errmsg, "Number text cannot be converted to a number: %s",
|
||||||
|
num_text);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
if(*num < o->min) {
|
||||||
|
sprintf(errmsg, "Number %s is too small", num_text);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
if(*num > o->max) {
|
||||||
|
sprintf(errmsg, "Number %s is too large", num_text);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Decode from_low","from_high"="to_low"[","[to_high]]
|
||||||
|
@param errmsg character array of at least size 80
|
||||||
|
*/
|
||||||
|
int Numbermapper_decode(struct NumbermappeR *o, char *text,
|
||||||
|
off_t *from_low, off_t *from_high,
|
||||||
|
off_t *to_low, off_t *to_high,
|
||||||
|
char *errmsg, int flag)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char *cpt, *npt;
|
||||||
|
|
||||||
|
*from_low= *to_low= (((off_t) 1) << 61);
|
||||||
|
*from_high= *to_high= -(((off_t) 1) << 61);
|
||||||
|
errmsg[0]= 0;
|
||||||
|
cpt= text;
|
||||||
|
|
||||||
|
ret= Numbermapper_decode_one(o, cpt, ',', from_low, &npt, errmsg, 0);
|
||||||
|
if(ret <= 0)
|
||||||
|
return(ret);
|
||||||
|
cpt= npt + 1;
|
||||||
|
ret= Numbermapper_decode_one(o, cpt, '=', from_high, &npt, errmsg, 0);
|
||||||
|
if(ret <= 0)
|
||||||
|
return(ret);
|
||||||
|
cpt= npt + 1;
|
||||||
|
ret= Numbermapper_decode_one(o, cpt, ',', to_low, &npt, errmsg, 1);
|
||||||
|
if(ret <= 0)
|
||||||
|
return(ret);
|
||||||
|
if(*npt == 0) {
|
||||||
|
*to_high= *to_low;
|
||||||
|
} else {
|
||||||
|
cpt= npt + 1;
|
||||||
|
ret= Numbermapper_decode_one(o, cpt, ':', to_high, &npt, errmsg, 1);
|
||||||
|
if(ret <= 0) {
|
||||||
|
if(npt <= cpt + 1) {
|
||||||
|
*to_high= o->max;
|
||||||
|
errmsg[0]= 0;
|
||||||
|
} else {
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* @param text character array of at least size 4 * 32 + 4 = 132
|
||||||
|
*/
|
||||||
|
int Numbermapper_encode(struct NumbermappeR *o, int idx, char *text, int size,
|
||||||
|
int flag)
|
||||||
|
{
|
||||||
|
int i, ret;
|
||||||
|
char num_text[80];
|
||||||
|
struct NumbermappinG *nm;
|
||||||
|
|
||||||
|
text[0]= 0;
|
||||||
|
if(idx < 0 || idx >= o->count)
|
||||||
|
return(0);
|
||||||
|
nm= o->mappings;
|
||||||
|
if(nm == NULL)
|
||||||
|
return(0);
|
||||||
|
for(i= 0; i < idx; i++) {
|
||||||
|
nm= nm->next;
|
||||||
|
if(nm == 0)
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
ret= Sfile_off_t_text(num_text, nm->from_low, 0);
|
||||||
|
if(ret <= 0)
|
||||||
|
return(0);
|
||||||
|
if(strlen(text) + strlen(num_text) + 1 >= (size_t) size)
|
||||||
|
return(0);
|
||||||
|
strcat(text, num_text);
|
||||||
|
strcat(text, ",");
|
||||||
|
ret= Sfile_off_t_text(num_text, nm->from_high, 0);
|
||||||
|
if(ret <= 0)
|
||||||
|
return(0);
|
||||||
|
if(strlen(text) + strlen(num_text) + 1 >= (size_t) size)
|
||||||
|
return(0);
|
||||||
|
strcat(text, num_text);
|
||||||
|
strcat(text, "=");
|
||||||
|
ret= Sfile_off_t_text(num_text, nm->to_low, 0);
|
||||||
|
if(ret <= 0)
|
||||||
|
return(0);
|
||||||
|
if(strlen(text) + strlen(num_text) + 1 >= (size_t) size)
|
||||||
|
return(0);
|
||||||
|
strcat(text, num_text);
|
||||||
|
if(nm->to_low == nm->to_high)
|
||||||
|
return(1);
|
||||||
|
strcat(text, ",");
|
||||||
|
if(nm->to_high == o->max)
|
||||||
|
return(1);
|
||||||
|
ret= Sfile_off_t_text(num_text, nm->to_high, 0);
|
||||||
|
if(ret <= 0)
|
||||||
|
return(0);
|
||||||
|
if(strlen(text) + strlen(num_text) + 1 >= (size_t) size)
|
||||||
|
return(0);
|
||||||
|
strcat(text, num_text);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Numbermapper_get_count(struct NumbermappeR *o, int flag)
|
||||||
|
{
|
||||||
|
if(o == NULL)
|
||||||
|
return(0);
|
||||||
|
return(o->count);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --------------------------- End NumbermappeR --------------------------- */
|
||||||
|
|
||||||
|
@ -191,5 +191,27 @@ int Permstack_peek(struct PermiteM **o, struct PermiteM *stopper,
|
|||||||
char *disk_path, struct stat **stbuf, int *chattr_flags,
|
char *disk_path, struct stat **stbuf, int *chattr_flags,
|
||||||
int flag);
|
int flag);
|
||||||
|
|
||||||
|
|
||||||
|
struct NumbermappeR; /* interval driven number conversion up to 2 exp 60 */
|
||||||
|
|
||||||
|
int Numbermapper_new(struct NumbermappeR **o, off_t min, off_t max, int flag);
|
||||||
|
|
||||||
|
int Numbermapper_destroy(struct NumbermappeR **o, int flag);
|
||||||
|
|
||||||
|
int Numbermapper_add(struct NumbermappeR *o, off_t from_low, off_t from_high,
|
||||||
|
off_t to_low, off_t to_high, int flag);
|
||||||
|
|
||||||
|
int Numbermapper_map(struct NumbermappeR *o, off_t from, off_t *to, int flag);
|
||||||
|
|
||||||
|
int Numbermapper_decode(struct NumbermappeR *o, char *text,
|
||||||
|
off_t *from_low, off_t *from_high,
|
||||||
|
off_t *to_low, off_t *to_high,
|
||||||
|
char *errmsg, int flag);
|
||||||
|
|
||||||
|
int Numbermapper_get_count(struct NumbermappeR *o, int flag);
|
||||||
|
|
||||||
|
int Numbermapper_encode(struct NumbermappeR *o, int idx, char *text, int size,
|
||||||
|
int flag);
|
||||||
|
|
||||||
#endif /* ! Xorriso_pvt_auxobj_includeD */
|
#endif /* ! Xorriso_pvt_auxobj_includeD */
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
#define Xorriso_timestamP "2025.03.01.150925"
|
#define Xorriso_timestamP "2025.03.27.204229"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user