2006-03-15 [長年日記]

[Q3] Pocket PC版のHTML表示でのリンクの処理

Pocket PC版でHTML表示しているときにリンクがクリックされた場合には、NM_HOTSPOTを処理して、URLをShellExecuteExしているのですが、相対URLの処理をしていませんでした。HTMLメールの場合には相対URLが入っていることはないので問題ありませんが、RSSだと問題があります。というわけで、IBrowser2::get_LocationBaseURLで取得したベースURLと一緒にCoInternetCombineUrlに渡して解決するようにしました。

このAPIはドキュメントが全く整備されていなくて、必要なバッファのサイズを取得するために何を渡せば良いのかも良くわかりませんが、pszResultにNULLを、cchResultに0を渡すと、pcchResultに必要なバッファの長さが返ってくるようです。ちなみにこのときの関数の戻り値は、ドキュメントを読むとS_FALSEじゃないかと思えますがE_POINTERになります。こちらのドキュメントでは、E_POINTERについても触れられていますが、バッファが小さい場合にどちらが返ってくるのかはよくわからず。しかも、pcchResultの説明には、

Pointer to an unsigned long integer value that receives the number of characters returned in pwzResult. Count does not include the NULL terminator.

と書いてあるのに、Remarksには、

the number returned in pcchResult is the length in bytes required to hold the result, which includes the NULL terminator.

と書いてあって、バイト単位なのか文字単位なのか、最後のNULLは含むのか含まないのか、一体なんなのかさっぱりわかりません。

[Haskell] AA折れ線グラフ

入力は'R','F','C'の3種類も文字からなる長さ1以上の文字列
  • 'R'は上昇を表し,折れ線グラフの要素としては '/' (スラッシュ)1文字に対応
  • 'F'は下降を表し,折れ線グラフの要素としては '\' (バックスラッシュ)1文字に対応
  • 'C'は変化なしを表し,折れ線グラフの要素としては'_'(アンダスコア)1文字に対応
#!/bin/env runghc

\begin{code}

module Main
    where

import Maybe

main :: IO()
main = getLine >>= putStr . plot . conv

conv :: String -> [(Int, Int)]
conv = reverse . init . foldl m [(0, 0)]
    where
        m :: [(Int, Int)] -> Char -> [(Int, Int)]
        m xss@((x, y):_) c | c == 'R' = (g x y, 1):xss
                           | c == 'F' = (g x y - 1, -1):xss
                           | c == 'C' = (g x y, 0):xss
        g :: Int -> Int -> Int
        g x 1 = x + 1
        g x _ = x

plot :: [(Int, Int)] -> String
plot x = [max, max - 1 .. min] >>= \p ->
         map Just x ++ [Nothing] >>= \q ->
         return $ toChar p q
    where
        (value, _) = unzip x
        min = minimum value
        max = maximum value
        toChar :: Int -> Maybe (Int, Int) -> Char
        toChar _ Nothing                   = '\n'
        toChar p (Just (q, r)) | p == q    = lineChar r
                               | otherwise = ' '
        lineChar :: Int -> Char
        lineChar = fromJust . flip lookup [(1, '/'), (-1, '\\'), (0, '_')]

\end{code}

トップ «前の日記(2006-03-14) 最新 次の日記(2006-03-16)»