Short: Patches from DeadOfNight
Date: 990330
Type: Patch
State: Unclassified
*** func_spec.old Thu Mar 7 22:46:47 1996
--- func_spec Thu Mar 7 22:47:16 1996
***************
*** 219,225 ****
--- 219,227 ----
void say(string|mixed *, void|object|object *);
string set_bit(string, int);
int set_heart_beat(int);
+ #if 0
int set_light(int);
+ #endif
void set_this_object(object);
int sizeof(mixed *|mapping);
mixed *slice_array F_RANGE (mixed *,int,int);
***************
*** 254,260 ****
--- 256,264 ----
* List of functions not used in compat mode.
*/
#ifdef EUIDS
+ #if 0
void export_uid(object);
+ #endif
string geteuid(object default: F_THIS_OBJECT);
int seteuid(string|int);
#endif
diff -c src.old/array.c src/array.c
*** src.old/array.c Wed Jan 3 16:42:28 1996
--- src/array.c Wed Jan 3 16:47:24 1996
***************
*** 1553,1561 ****
return vtmpp3;
}
! struct vector *match_regexp(v, pattern)
struct vector *v;
char *pattern;
{
struct regexp *reg;
char *res;
--- 1553,1564 ----
return vtmpp3;
}
! #define REGEXP_FILTER 1
! #define REGEXP_NOTMATCH 2
! struct vector *match_regexp(v, pattern, filt)
struct vector *v;
char *pattern;
+ int filt;
{
struct regexp *reg;
char *res;
***************
*** 1577,1593 ****
continue;
eval_cost++;
line = v->item[i].u.string;
! if (regexec(reg, line, line) == 0)
continue;
res[i] = 1;
num_match++;
}
! ret = allocate_array(num_match);
! for (num_match=i=0; i < v_size; i++) {
if (res[i] == 0)
continue;
assign_svalue_no_free(&ret->item[num_match], &v->item[i]);
num_match++;
}
xfree((char *)reg);
return ret;
--- 1580,1605 ----
continue;
eval_cost++;
line = v->item[i].u.string;
! if((regexec(reg, line, line) == 0) ^ ((filt®EXP_NOTMATCH) != 0))
continue;
res[i] = 1;
num_match++;
}
! if(filt & REGEXP_FILTER) {
! ret = allocate_array(v_size);
! for(i=0; i < v_size; i++) {
! (ret->item)[i].type = T_NUMBER;
! (ret->item)[i].u.number = res[i];
! }
! }
! else {
! ret = allocate_array(num_match);
! for (num_match=i=0; i < v_size; i++) {
if (res[i] == 0)
continue;
assign_svalue_no_free(&ret->item[num_match], &v->item[i]);
num_match++;
+ }
}
xfree((char *)reg);
return ret;
diff -c src.old/func_spec src/func_spec
*** src.old/func_spec Wed Jan 3 16:42:29 1996
--- src/func_spec Wed Jan 3 16:44:30 1996
***************
*** 151,157 ****
%efuns
! string *regexp(string *, string);
void add_action(string, void|string, void|int);
object *all_inventory(object default: F_THIS_OBJECT);
mixed *allocate(int);
--- 151,157 ----
%efuns
! mixed *regexp(string *, string, int default: F_CONST0);
void add_action(string, void|string, void|int);
object *all_inventory(object default: F_THIS_OBJECT);
mixed *allocate(int);
diff -c src.old/interpret.c src/interpret.c
*** src.old/interpret.c Wed Jan 3 16:42:31 1996
--- src/interpret.c Wed Jan 3 16:44:31 1996
***************
*** 3329,3337 ****
CASE(F_REGEXP);
{
struct vector *v;
! TYPE_TEST1(sp-1, T_POINTER)
! TYPE_TEST2(sp, T_STRING)
! v = match_regexp((sp-1)->u.vec, sp->u.string);
pop_stack();
free_svalue(sp);
if (v == 0)
--- 3329,3340 ----
CASE(F_REGEXP);
{
struct vector *v;
!
! TYPE_TEST1(sp-2, T_POINTER)
! TYPE_TEST2(sp-1, T_STRING)
! TYPE_TEST3(sp, T_NUMBER)
! v = match_regexp((sp-2)->u.vec, (sp-1)->u.string, sp->u.number);
! sp--;
pop_stack();
free_svalue(sp);
if (v == 0)
diff -c src.old/lint.h src/lint.h
*** src.old/lint.h Wed Jan 3 16:42:31 1996
--- src/lint.h Wed Jan 3 16:44:31 1996
***************
*** 500,506 ****
struct object *get_simul_efun_object PROT((void));
struct function *find_simul_efun PROT((char *));
char *query_simul_efun_file_name PROT((void));
! struct vector *match_regexp PROT((struct vector *v, char *pattern));
void setup_print_block_dispatcher();
char *query_host_name();
void init_telopts();
--- 500,506 ----
struct object *get_simul_efun_object PROT((void));
=== More: (93%) Page 7, 121..140 [CR,u,f,l,q,/<regexp>,<page>,?]
struct function *find_simul_efun PROT((char *));
char *query_simul_efun_file_name PROT((void));
! struct vector *match_regexp PROT((struct vector *v, char *pattern, int filt));
void setup_print_block_dispatcher();
char *query_host_name();
void init_telopts();
diff -c src.old/array.c src/array.c
*** src.old/array.c Wed Jan 3 16:57:36 1996
--- src/array.c Wed Jan 3 16:47:24 1996
***************
*** 1621,1635 ****
struct regexplode_match *matches, **matchp, *match;
char *text, *str;
struct svalue *svp;
! int num_match;
struct vector *ret;
! if (sp[-1].type != T_STRING)
bad_xefun_arg(1, sp);
! if (sp->type != T_STRING)
bad_xefun_arg(2, sp);
! text = sp[-1].u.string;
! pattern = sp->u.string;
reg = regcomp(pattern, 0);
if (reg == 0) {
inter_sp = sp;
--- 1621,1638 ----
struct regexplode_match *matches, **matchp, *match;
char *text, *str;
struct svalue *svp;
! int num_match, ret_len, filt;
struct vector *ret;
! if(sp[-2].type != T_STRING)
bad_xefun_arg(1, sp);
! if (sp[-1].type != T_STRING)
bad_xefun_arg(2, sp);
! if (sp->type != T_NUMBER)
! bad_xefun_arg(3, sp);
! text = sp[-2].u.string;
! pattern = sp[-1].u.string;
! filt = sp->u.number;
reg = regcomp(pattern, 0);
if (reg == 0) {
inter_sp = sp;
***************
*** 1650,1661 ****
break;
}
*matchp = 0;
! if (num_match > (MAX_ARRAY_SIZE-1 >> 1) ) {
xfree((char *)reg);
inter_sp = sp;
error("Illegal array size");
}
! ret = allocate_array((num_match << 1) + 1);
svp = ret->item;
match = matches;
while (match) {
--- 1653,1665 ----
break;
}
*matchp = 0;
! ret_len = (filt?(num_match+1):((num_match<<1)+1));
! if(ret_len > MAX_ARRAY_SIZE) {
xfree((char *)reg);
inter_sp = sp;
error("Illegal array size");
}
! ret = allocate_array(ret_len);
svp = ret->item;
match = matches;
while (match) {
***************
*** 1671,1690 ****
svp->u.string = str;
svp++;
len = match->end - text;
! str = xalloc(len + 1);
! strncpy(str, text, len);
! str[len] = 0;
text += len;
- svp->type = T_STRING;
- svp->x.string_type = STRING_MALLOC;
- svp->u.string = str;
- svp++;
match = match->next;
}
xfree((char *)reg);
svp->type = T_STRING;
svp->x.string_type = STRING_MALLOC;
svp->u.string = string_copy(text);
free_string_svalue(sp);
sp--;
free_string_svalue(sp);
--- 1675,1697 ----
svp->u.string = str;
svp++;
len = match->end - text;
! if(!filt) {
! str = xalloc(len + 1);
! strncpy(str, text, len);
! str[len] = 0;
! svp->type = T_STRING;
! svp->x.string_type = STRING_MALLOC;
! svp->u.string = str;
! svp++;
! }
text += len;
match = match->next;
}
xfree((char *)reg);
svp->type = T_STRING;
svp->x.string_type = STRING_MALLOC;
svp->u.string = string_copy(text);
+ sp--;
free_string_svalue(sp);
sp--;
free_string_svalue(sp);
diff -c src.old/func_spec src/func_spec
*** src.old/func_spec Wed Jan 3 17:01:18 1996
--- src/func_spec Wed Jan 3 16:44:30 1996
***************
*** 410,416 ****
mixed query_editing(object);
int query_idle(object);
object query_snoop(object);
! string *regexplode(string, string);
int remove_action(string, object default: F_THIS_PLAYER);
void remove_interactive(object);
void rename_object(object, string);
--- 410,416 ----
mixed query_editing(object);
int query_idle(object);
object query_snoop(object);
! string *regexplode(string, string, int default: F_CONST0);
int remove_action(string, object default: F_THIS_PLAYER);
void remove_interactive(object);
void rename_object(object, string);
*** func_spec.bak Mon Mar 11 13:47:37 1996
--- func_spec Sun Mar 10 14:52:30 1996
***************
*** 420,425 ****
--- 420,426 ----
int remove_action(string, object default: F_THIS_PLAYER);
void remove_interactive(object);
void rename_object(object, string);
+ string subst(string, string|string*|mapping, string|string* default:F_CONST0);
void set_auto_include_string(string);
int set_buffer_size(int);
void set_connection_charset(int *, int default: F_CONST1);
*** interpret.bak Thu Mar 14 19:25:40 1996
--- interpret.c Thu Mar 14 19:20:01 1996
***************
*** 12794,12796 ****
--- 12794,12944 ----
put_number(0);
return sp;
}
+
+ #define MAP_LENGTH(m) (m->condensed->string_size/sizeof(char *) + \
+ m->condensed->misc_size/sizeof(struct svalue) + \
+ (m->hash ? m->hash->used - m->hash->condensed_deleted : 0))
+
+ struct table_entry {
+ char *search;
+ char *replace;
+ int slen;
+ int rlen;
+ int partial;
+ };
+
+ int bad_subst_mapping;
+
+ void map_table_part(key, value, extra)
+ struct svalue *key, *value;
+ char *extra;
+ {
+ struct table_entry **entry = (struct table_entry **)extra;
+ if((key->type != T_STRING ) || (value->type != T_STRING)) {
+ bad_subst_mapping = 1;
+ return;
+ }
+ (*entry)->search = key->u.string;
+ (*entry)->partial = 0;
+ if((*entry)->slen = strlen(key->u.string)) {
+ (*entry)->rlen = strlen(value->u.string);
+ (*entry)->replace = value->u.string;
+ }
+ (*entry)++;
+ }
+
+ struct svalue *f_subst(sp)
+ struct svalue *sp;
+ {
+ struct table_entry *table, **build_table;
+
+ struct r_match {
+ char *addr;
+ char *replace;
+ int slen;
+ int rlen;
+ struct r_match *next;
+ };
+ struct r_match *first, *current;
+
+ int outlen, num_sr, i;
+ char *str, *match, *outp;
+ struct mapping *m;
+
+ if(sp[-2].type != T_STRING) bad_xefun_arg(1, sp);
+ str = sp[-2].u.string;
+ switch(sp[-1].type) {
+ case T_STRING:
+ if(sp->type != T_STRING) bad_xefun_arg(3, sp);
+ num_sr = 1;
+ table = (struct table_entry *)alloca(sizeof *table);
+ table->partial = 0;
+ table->search = sp[-1].u.string;
+ if(table->slen = strlen(table->search)) {
+ table->replace = sp->u.string;
+ table->rlen = strlen(table->replace);
+ }
+ break;
+ case T_POINTER:
+ if(sp->type != T_POINTER) bad_xefun_arg(3, sp);
+ if((num_sr = VEC_SIZE(sp->u.vec)) != VEC_SIZE(sp[-1].u.vec))
+ error("Mismatched array sizes in subst()\n");
+ table = (struct table_entry *)alloca(num_sr * (sizeof *table));
+ for(i=0;i<num_sr;i++) {
+ if(sp[-1].u.vec->item[i].type != T_STRING) bad_xefun_arg(2, sp);
+ if(sp->u.vec->item[i].type != T_STRING) bad_xefun_arg(3, sp);
+ table[i].partial = 0;
+ table[i].search = sp[-1].u.vec->item[i].u.string;
+ if(table[i].slen = strlen(table[i].search)) {
+ table[i].replace = sp->u.vec->item[i].u.string;
+ table[i].rlen = strlen(table[i].replace);
+ }
+ }
+ break;
+ case T_MAPPING:
+ bad_subst_mapping = 0;
+ m = sp[-1].u.map;
+ if(m->num_values != 1)
+ bad_xefun_arg(2, sp);
+ if(sp->u.number) bad_xefun_arg(3, sp);
+ check_map_for_destr(m);
+ table = (struct table_entry *)alloca((num_sr = MAP_LENGTH(m)) *
+ (sizeof *table));
+ build_table = (struct table_entry **)alloca(sizeof *build_table);
+ *build_table = table;
+ walk_mapping(sp[-1].u.map, map_table_part, (char *)build_table);
+ if(bad_subst_mapping) bad_xefun_arg(2, sp);
+ break;
+ default:
+ bad_xefun_arg(2, sp);
+ }
+
+ match = str;
+ outlen = 0;
+ first = current = 0;
+ while(*match) {
+ outlen++;
+ for(i=0;i<num_sr;i++) {
+ if(!table[i].slen) continue;
+ if(*match == table[i].search[table[i].partial]) {
+ if(++(table[i].partial) == table[i].slen) {
+ if(first == 0)
+ first = current =
+ (struct r_match *)alloca(sizeof *first);
+ else {
+ current->next =
+ (struct r_match *)alloca(sizeof *current);
+ current = current->next;
+ }
+ current->next = 0;
+ current->addr = match + 1 - table[i].slen;
+ current->replace = table[i].replace;
+ current->slen = table[i].slen;
+ current->rlen = table[i].rlen;
+ outlen += (table[i].rlen - table[i].slen);
+ for(i=0;i<num_sr;i++) table[i].partial = 0;
+ break;
+ }
+ }
+ else table[i].partial = 0;
+ }
+ match++;
+ }
+ match = outp = xalloc(outlen + 1);
+ current = first;
+ while(current != 0) {
+ while(str != current->addr) { *match++ = *str++; }
+ strcpy(match, current->replace);
+ match += current->rlen;
+ str += current->slen;
+ current = current->next;
+ }
+ strcpy(match, str);
+ free_svalue(sp--);
+ free_svalue(sp--);
+ free_svalue(sp);
+ sp->type = T_STRING;
+ sp->x.string_type = STRING_MALLOC;
+ sp->u.string = outp;
+ return sp;
+ }