Just for your clarification...usually the creator is a single word or name. The credits line (for me) may become a thing of the past as with this code I'll probably just separate out everything and store it all in the struct as what they are rather than just a huge credit line. Thanks to all who posted a solution. They all worked BTW.
-K > -----Original Message----- > From: Mike Barton [mailto:[EMAIL PROTECTED] > Sent: Tuesday, December 23, 2003 5:50 PM > To: Richard Lindsey; Mervine, Keith; [email protected] > Subject: Re: Taking a string and separating it into different vars > > > Am I the only one who uses sscanf? > > int level1 = 0, level2 = 0; > char levels[32], builder[32], area[32], *trimchr; > if (sscanf(credits, "@[EMAIL PROTECTED] [EMAIL PROTECTED]@[EMAIL > PROTECTED]@x", levels, > builder, area) < 3) > log_string("Problem parsing credits string."); > if (sscanf(levels, "%d%d", &level1, &level2) < 2) > log_string("Problem parsing levels from credits string."); > trimchr = &builder[strlen(builder)]; > do {*(trimchr--) = '\0';} > while (*trimchr <= ' '); > > So what are we doing? > sscanf uses an almost regular expression-style matching to > parse variables out > of a string. Its return value is the number of arguments it > matched. So we > sscanf once and see if we can match everything (4 variables). > If not, fall > back on parsing without the levels. > Then I trimmed whitespace from the right of builder, since there was > whitespace on the right of builder. > > There are a couple of things that could make it better, but > it would require > more knowledge of the credits strings. > For example, is there ever a space in the builder's name? If > not, you could > get away without doing the trim (match up to the first > whitespace instead of > the @ symbol). > > --Palrich. > > On Tuesday 23 December 2003 03:55 pm, Richard Lindsey wrote: > > Ok, I spent the last hour or so putting together a little > function that > > *should* do it for you... none of it has been tested, so > you'll have to > > do that, but if there are any bugs, they should be minor... > also I don't > > promise that it's the most efficient way to do it memory-wise, but > > again, it should work :) just call it from whatever > function you need > > the info parsed from, like if it's a > find-area-for-this-mob's-level kind > > of command, you'd call it from there, and you'll have to declare the > > variables to use in that function... the parse function > only parses to > > the variables you send it... so for example, if you were > calling it from > > the parent function, you'd declare a variable for the lower > level range, > > upper level range, creator name, and area name, like so: > > > > int minlvl, maxlvl; > > char creator[MAX_STRING_LENGTH], name[MAX_STRING_LENGTH]; > > > > then when you loop through the area list or whatever you're > searching > > through, call the function w/ those 4 variables, and the > credits as the > > first argument to the function... assuming that you're > using a variable > > called pArea as your AREA_DATA type, you'd call it like so from the > > parent function: > > > > parse_credits(pArea->credits,minlvl,maxlvl,creator,name); > > > > and then for this credit line: "@w{ 1 [EMAIL PROTECTED] Diku @[EMAIL > > PROTECTED]" > > it should set the following values (it'll strip the color > codes too): > > > > minlvl = 1; > > maxlvl = 99; > > creator = "Diku"; > > name = "REverdale"; > > > > which you can then use from the parent function... hope it helps... > > > > void parse_credits( char *credits, minlvl, maxlvl, creator, name ) > > { > > char *point, *point2, *levels, buf[MAX_STRING_LENGTH]; > > char buf2[MAX_STRING_LENGTH], value[MAX_STRING_LENGTH]; > > > > buf[0] = '\0'; > > point2 = buf; > > > > /* First strip the color codes */ > > for ( point = credits; *point; ++point ) > > { > > if ( *point == '@' ) > > { > > ++point; > > continue; > > } > > > > *point2 = *point; > > *++point2 = '\0'; > > } > > > > /* Now point2 should be a black and white version of credits, > > so we just break it up into arguments, which means 1 more > > loop to isolate level range before we use one_argument */ > > point2 = buf; > > buf2[0] = '\0'; > > levels = buf2; > > for ( point = point2; *point; ++point ) > > { > > if ( *point == '{' ) > > continue; > > else if ( *point == '}' ) > > { > > ++point; > > break; > > } > > > > *levels = *point; > > *++levels = '\0'; > > } > > > > /* Now levels should contain just the segment within the > > braces, and point should contain everything after the > > braces, and we can use one_argument for the rest... */ > > levels = one_argument(levels,value); > > > > if ( !is_number(value) ) > > log_string("Invalid numeric argument in area > credits (minlvl)"); > > else minlvl = atoi(value); > > > > levels = one_argument(levels,value); > > > > if ( !is_number(value) ) > > log_string("Invalid numeric argument in area > credits (maxlvl)"); > > else maxlvl = atoi(value); > > > > point = one_argument(point,creator); > > point = one_argument(point,name); > > return; > > } > > > > Richard Lindsey > > > > -----Original Message----- > > From: Mervine, Keith [mailto:[EMAIL PROTECTED] > > Sent: Tuesday, December 23, 2003 2:27 PM > > To: [email protected] > > Subject: Taking a string and separating it into different vars > > > > Hello all. > > > > I need to take my Credits line of my area files and separate it into > > 3 separate variables...and example of my credits line is as follows. > > > > The credits are char *credits > > > > @w{ 1 [EMAIL PROTECTED] Diku @[EMAIL PROTECTED] > > @[EMAIL PROTECTED] Thalor @RThe Tower of [EMAIL PROTECTED] > > @w{ 5 [EMAIL PROTECTED] Strahd @RTown Of [EMAIL PROTECTED] > > > > the @'s are my color code... > > > > What I need is to have the vars like this > > > > levels = 1-99 > > creator = Diku > > > > Can someone give me a hint on how to start? > > > > > > Thanks! > > > > -K > > > > -- > > ROM mailing list > > [email protected] > > http://www.rom.org/cgi-bin/mailman/listinfo/rom > >

