void display_things(object *ob);
string get_number(int i);
string get_plural(string s);
string list_nicely(string *list);

/*
 * mylook(0) - gives look
 * mylook(1) - gives brief
 * mylook(2) - just objects
 */

int mylook(int i) {
  object *allinv;
  object *liv;
  object *nonliv;
  switch(i) {
    case 0: environment()->long(); break;
    case 1: printf("%s.\n", (string)environment()->short()); break;
  }
  allinv=filter_array(all_inventory(environment()),
	"no_short_filter", this_object(), this_object());
  liv=filter_array(allinv, "living_filter", this_object(), 1);
  nonliv=filter_array(allinv, "living_filter", this_object(), 0);
  if(sizeof(liv))
    display_things(liv);
  if(sizeof(nonliv))
    display_things(nonliv);
  return 1;
}

int no_short_filter(object ob, object ob2) {
  return ob->short() && ob!=ob2;
}

int living_filter(object ob, int i) {
  return living(ob)==i;
}

void display_things(object *ob) {
  string *names;
  mixed *uniq;
  int i,j;
  uniq=unique_array(ob, "short");
  j=sizeof(uniq);
  names=allocate(j);
  for(i=0;i<j;i++) {
    string tmp,tmp2,pl;
    tmp=0;
    if(!uniq[i][0]->id("corpse"))
      tmp=(string)uniq[i][0]->query_name();
    if(!tmp)
      tmp=(string)uniq[i][0]->short();
    tmp2=get_number(sizeof(uniq[i]));
    if(tmp2!="") {
      if(strlen(tmp)>3) {
        if(lower_case(tmp[0..1])=="a ")
          tmp=extract(tmp,2);
        else if(lower_case(tmp[0..2])=="an ")
          tmp=extract(tmp,3);
        else if(lower_case(tmp[0..3])=="the ")
          tmp=extract(tmp,4);
      }
      names[i]=tmp2 + ((pl=(string)uniq[i][0]->query_plural())
	? pl : get_plural(tmp));
    }
    else {
      if(strlen(tmp)>3) {
	if(tmp[0..1]=="A ")
	  tmp="a " + extract(tmp,2);
	else if(tmp[0..2]=="An ")
	  tmp="an " + extract(tmp,3);
	else if(tmp[0..3]=="The ")
	  tmp="the " + extract(tmp,4);
      }
      names[i]=tmp;
    }
  }
  printf("%*=-s", 79, (capitalize(list_nicely(names)))
	+ (sizeof(ob)>1 ? " are" : " is") + " here.\n");
}

string get_number(int i) {
  if(i>10)
    return "Many ";
  return ({ "", "", "Two ", "Three ", "Four ", "Five ",
	"Six ", "Seven ", "Eight ", "Nine ", "Ten " })[i];
}

string get_plural(string s) {
  int i;
  i=strlen(s)-1;
  switch(s[i..i]) {
    case "f": if(i && s[i-1..i-1]=="f") return s + "s";
	      else return s[0..i-1] + "ves"; break;
    case "s": return s; break;
    case "x": return s + "es"; break;
    case "z": return s + "zes"; break;
    default:  return s + "s";
  }
}

string list_nicely(string *list) {
  int j,i;
  string output;
  j=sizeof(list)-1;
  switch(j) {
    case 0:
      return list[0];
      break;
    case 1:
      return list[0] + " and " + list[1];
      break;
    default:
      output="";
      j--;
      for(i=0;i<j;i++)
	output+=list[i]+", ";
      output+=list[j] + " and " + list[j+1];
      return output;
      break;
  }
}
