Complete details of the data structures are given in the Unofficial Doom Specs.
Each wall consists of a linedef that references one or two sidedefs (right and maybe left). Each sidedef has three texture names (lower, middle, and upper) with up to eight characters each. (The name "-" means no texture: either not applicable or totally transparent.)
The Doom engine looks up a texture name using the wall texture lumps TEXTURE1 and TEXTURE2. (TEXTURE1 is present in all Doom versions; TEXTURE2 supports the additional textures in registered/Ultimate Doom and Doom II.) This yields a list of indices into the PNAMES lump. For each index, PNAMES gives the name of a lump known as a wall patch; each wall patch lump is stored in Doom's picture format. Rendering the texture's list of patches gives the final texture graphic that can be applied to any wall surface.
Wall textures must be exactly 128 units high, or the tutti-frutti effect will occur. There is no maximum width.
Middle Textures or Patches (as termed by Tom Hall) are used to simulate Blood on walls, Rust or Oil, Signs etc. Patches are not actually part of the main linedef (that ends a particular sector) and are placed before the end linedef (Between 1 and 8 mp away).