code: public int getFCD16FromNormData(int c) {
          // Only loops for 1:1 algorithmic mappings.
          for(;;) {
              int norm16=getNorm16(c);
              if(norm16<=minYesNo) {
                  // no decomposition or Hangul syllable, all zeros
                  return 0;
              } else if(norm16>=MIN_NORMAL_MAYBE_YES) {
                  // combining mark
                  norm16&=0xff;
                  return norm16|(norm16<<8);
              } else if(norm16>=minMaybeYes) {
                  return 0;
              } else if(isDecompNoAlgorithmic(norm16)) {
                  c=mapAlgorithmic(c, norm16);
              } else {
                  // c decomposes, get everything from the variable-length extra data
                  int firstUnit=extraData.charAt(norm16);
                  if((firstUnit&MAPPING_LENGTH_MASK)==0) {
                      // A character that is deleted (maps to an empty string) must
                      // get the worst-case lccc and tccc values because arbitrary
                      // characters on both sides will become adjacent.
                      return 0x1ff;
                  } else {
                      int fcd16=firstUnit>>8;  // tccc
                      if((firstUnit&MAPPING_HAS_CCC_LCCC_WORD)!=0) {
                          fcd16|=extraData.charAt(norm16-1)&0xff00;  // lccc
                      }
                      return fcd16;
                  }
              }
          }
      }
docs: Gets the FCD value from the regular normalization data.