void set_trace_flags(const char *s) { char mode = 0; unsigned int f = 0; if (*s == '+' || *s == '-') mode = *s++; while (*s) f |= letter_to_flag(*s++); switch(mode) { case 0: trace_flags = f; break; case '+': trace_flags |= f; break; case '-': trace_flags &= ~f; break; } }
int cf_flag_name( int *vp, char *str, long extra, dbref player, char *cmd ) { char *numstr, *namestr, *tokst; FLAGENT *fp; int flagnum = -1; char *flagstr, *cp; numstr = strtok_r( str, " \t=,", &tokst ); namestr = strtok_r( NULL, " \t=,", &tokst ); if( numstr && ( strlen( numstr ) == 1 ) ) { flagnum = ( int ) strtol( numstr, ( char ** ) NULL, 10 ); } if( ( flagnum < 0 ) || ( flagnum > 9 ) ) { cf_log_notfound( player, cmd, "Not a marker flag", numstr ); return -1; } if( ( fp = letter_to_flag( *numstr ) ) == NULL ) { cf_log_notfound( player, cmd, "Marker flag", numstr ); return -1; } /* * Our conditions: The flag name MUST start with an underscore. It * must not conflict with the name of any existing flag. There is a * KNOWN MEMORY LEAK here -- if you name the flag and rename it * later, the old bit of memory for the name won't get freed. This * should pretty much never happen, since you're not going to run * around arbitrarily giving your flags new names all the time. */ flagstr = xstrprintf( "cf_flag_name", "_%s", namestr ); if( strlen( flagstr ) > 31 ) { cf_log_syntax( player, cmd, "Marker flag name too long: %s", namestr ); XFREE( flagstr, "cf_flag_name" ); } for( cp = flagstr; cp && *cp; cp++ ) { if( !isalnum( *cp ) && ( *cp != '_' ) ) { cf_log_syntax( player, cmd, "Illegal marker flag name: %s", namestr ); XFREE( flagstr, "cf_flag_name" ); return -1; } *cp = tolower( *cp ); } if( hashfind( flagstr, &mudstate.flags_htab ) ) { XFREE( flagstr, "cf_flag_name" ); cf_log_syntax( player, cmd, "Marker flag name in use: %s", namestr ); return -1; } for( cp = flagstr; cp && *cp; cp++ ) { *cp = toupper( *cp ); } fp->flagname = ( const char * ) flagstr; hashadd( ( char * ) fp->flagname, ( int * ) fp, &mudstate.flags_htab, 0 ); return 0; }