<feed xmlns='http://www.w3.org/2005/Atom'>
<title>c/tests, branch main</title>
<subtitle>C client for the public CEP API
</subtitle>
<id>http://git.cep.is/c/atom?h=main</id>
<link rel='self' href='http://git.cep.is/c/atom?h=main'/>
<link rel='alternate' type='text/html' href='http://git.cep.is/c/'/>
<updated>2026-07-27T23:44:20Z</updated>
<entry>
<title>Report the municipality behind a not-found CEP</title>
<updated>2026-07-27T23:44:20Z</updated>
<author>
<name>Murilo Ijanc</name>
<email>murilo@ijanc.org</email>
</author>
<published>2026-07-27T23:37:05Z</published>
<link rel='alternate' type='text/html' href='http://git.cep.is/c/commit/?id=eb15ec9b2715783fcd2bf4f834595d1bd549c09d'/>
<id>urn:sha1:eb15ec9b2715783fcd2bf4f834595d1bd549c09d</id>
<content type='text'>
A CEP that fails is rarely a random number. It is usually someone who
knows the city and guessed the last digits, and the classic guess is the
-000 that 957 municipalities never received. The API now answers those
404s with a faixa block naming the municipality the CEP would have
belonged to, and telling a caller "that CEP does not exist, did you mean
somewhere in Areal/RJ?" is worth far more than telling them "no".

It rides on cepis_error_t rather than on cepis_address_t because it is
context for a failure, not an address: the lookup still returns
CEPIS_ERR_NOT_FOUND and still hands back no address. Embedded by value
with a has_faixa flag, so the error keeps owning nothing and keeps
living on the stack with nothing to free; cepis_error_faixa gives the
absent case the same NULL-or-not shape as cepis_address_t::geo, which is
what the API's omit-never-null encoding calls for.

Parsing is total on purpose. A body that is not JSON, a faixa that is
null, a string, an array, or an object with no localidade all mean "the
API named no municipality". A 404 is already the answer, and failing to
read the garnish must never turn it into a different one.

The bounds need reading with care, hence the length of the comments:
cep_ini and cep_fim are the smallest and largest CEP that actually
exist, not the range the Correios publish -- the DNE's own start for
Areal is 25845000, exactly the CEP that just failed -- and the range is
sparse, 118 CEPs scattered over the ~4900 numbers up to 25849899. That
is what ceps is for.
</content>
</entry>
<entry>
<title>Initial import</title>
<updated>2026-07-26T15:25:48Z</updated>
<author>
<name>Murilo Ijanc</name>
<email>murilo@ijanc.org</email>
</author>
<published>2026-07-26T15:25:48Z</published>
<link rel='alternate' type='text/html' href='http://git.cep.is/c/commit/?id=e2c6ae13af335b311da2429c903032124f926df2'/>
<id>urn:sha1:e2c6ae13af335b311da2429c903032124f926df2</id>
<content type='text'>
</content>
</entry>
</feed>
