+(defun isearch-search-string (string bound noerror)
+ ;; Search for the first occurance of STRING or its translation. If
+ ;; found, move point to the end of the occurance, update
+ ;; isearch-match-beg and isearch-match-end, and return point.
+ (let ((func (isearch-search-fun))
+ (len (length string))
+ pos1 pos2)
+ (setq pos1 (save-excursion (funcall func string bound noerror)))
+ (if (and (char-table-p translation-table-for-input)
+ (> (string-bytes string) len))
+ (let (translated match-data)
+ (dotimes (i len)
+ (let ((x (aref translation-table-for-input (aref string i))))
+ (when x
+ (or translated (setq translated (copy-sequence string)))
+ (aset translated i x))))
+ (when translated
+ (save-match-data
+ (save-excursion
+ (if (setq pos2 (funcall func translated bound noerror))
+ (setq match-data (match-data t)))))
+ (when (and pos2
+ (or (not pos1)
+ (if isearch-forward (< pos2 pos1) (> pos2 pos1))))
+ (setq pos1 pos2)
+ (set-match-data match-data)))))
+ (if pos1
+ (goto-char pos1))
+ pos1))
+