diff mupdf-source/docs/reference/c/coding-style.md @ 3:2c135c81b16c

MERGE: upstream PyMuPDF 1.26.4 with MuPDF 1.26.7
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:44:09 +0200
parents b50eed0cc0ef
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mupdf-source/docs/reference/c/coding-style.md	Mon Sep 15 11:44:09 2025 +0200
@@ -0,0 +1,87 @@
+# Coding Style
+
+This is a basic overview of the MuPDF coding style used in the C library.
+
+## Indentation
+
+There are two hard rules:
+
+1. Indent with hard tabs.
+2. Do not vertically align anything beyond the left edge!
+
+If you want a different indentation level, configure your editor to use
+whichever tab width you prefer. If you follow the two rules above, everything
+will work out perfectly.
+
+The rest you should be able to infer from the source around you:
+
+- Curly braces on their own line.
+- Put a space between `if`, `for`, `while`, and their expression.
+
+## Names
+
+Functions should be named according to one of the following schemes:
+
+- verb_noun
+- verb_noun_with_noun
+- noun_attribute
+- set_noun_attribute
+- noun_from_noun -- convert from one type to another (avoid noun_to_noun)
+
+Prefixes are mandatory for exported functions, macros, enums, globals and
+types.
+
+- fz for common code
+- pdf, xps, etc., for interpreter specific code
+
+Prefixes are optional (but encouraged) for private functions and types.
+
+Avoid using 'get' as this is a meaningless and redundant filler word.
+
+These words are reserved for reference counting schemes:
+
+- new, create, find, load, open, keep -- return objects that you are responsible for freeing.
+- drop -- relinquish ownership of the object passed in.
+
+When searching for an object or value, the name used depends on whether
+returning the value is passing ownership:
+
+- lookup -- return a value or borrowed pointer
+- find -- return an object that the caller is responsible for freeing
+
+## Types
+
+Various different integer types are used throughout MuPDF.
+
+In general:
+
+- int is assumed to be 32bit at least.
+- short is assumed to be exactly 16 bits.
+- char is assumed to be exactly 8 bits.
+- array sizes, string lengths, and allocations are measured using size_t.
+- size_t is 32bit in 32bit builds, and 64bit on all 64bit builds.
+- buffers of data use unsigned chars (or uint8_t).
+- Offsets within files/streams are represented using int64_t.
+
+In addition, we use floats (and avoid doubles when possible), assumed to be
+IEEE compliant.
+
+## Reference counting
+
+Reference counting uses special words in functions to make it easy to remember
+and follow the rules.
+
+Words that take ownership: new, find, load, open, keep.
+
+Words that release ownership: drop.
+
+If an object is returned by a function with one of the special words that take
+ownership, you are responsible for freeing it by calling "drop" or "free", or
+"close" before you return. You may pass ownership of an owned object by return
+it only if you name the function using one of the special words.
+
+Any objects returned by functions that do not have any of these special words,
+are borrowed and have a limited life time. Do not hold on to them past the
+duration of the current function, or stow them away inside structs. If you need
+to keep the object for longer than that, you have to either "keep" it or make
+your own copy.