Each wall consists of a linedef that references one or two sidedefs (right and optionally 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.)
If a wall is tall enough that the texture needs to be tiled vertically, the texture graphics should be exactly 128 units high, or the tutti-frutti effect will occur. (This, however, has been addressed in most advanced source ports.)
There is no maximum width. If the wall area is larger than the graphic, the pattern will be tiled. Depending on the geometry of the map design, many textures may be clipped or offset (see Texture alignment).
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, but is not found in 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.
As with most lumps, if you replace a TEXTUREx lump in a PWAD, the original IWAD lump will not be loaded. Therefore you need to copy the existing texture definitions from the IWAD into your PWAD, alongside any new ones. For Doom II, you can take advantage of the missing TEXTURE2 lump and provide just new or changed texture definitions in that lump.
Complete details of the data structures are given in the Unofficial Doom Specs.