Most procedural programming languages, due to their restricted type systems, do not allow for polymorphic software components in the style of functional languages. Such polymorphism however greatly increases the potential for component reuse, while still guaranteeing the security of strong typing. In this paper, we show how to obtain polymorphic software components for "ordinary'' languages like C or Modula-2. Our method is based on generic type inference in a software component library. The source of polymorphism is the use of free (undeclared) names in a component. The analysis algorithm will infer signature schemes, which are analoguous to type schemes in functional languages. Signature schemes can be used to check library consistency and allow to retrieve components by usage patterns.