One idea is to extend the domain with a piecewise function by taking limits at singularities.
ExtendFunctionDomain[expr_, vars_] := Module[{domain, antidomain, locassums, lims},
domain = FunctionDomain[expr, vars, Reals] /. {
NotElement[f_, S_] :> Not[f == C[1] && Element[C[1], S]]
};
antidomain = Reduce`ToDNF[Reduce[!domain, vars, Reals]];
locassums = ExtractRootsAndAssumptions[antidomain];
If[!MatchQ[locassums, {{{_Rule}, _}..}],
Return[expr]
];
lims = ExtendedLimit[expr, ##]& @@@ locassums;
If[!FreeQ[lims, $Failed],
Return[expr]
];
Piecewise[MapThread[{#1, (And @@ Equal @@@ #2[[1]]) && #2[[2]]}&, {lims, locassums}], expr]
]
ExtractRootsAndAssumptions[HoldPattern[Or][args__]] :=
iExtractRootsAndAssumptions /@ {args}
ExtractRootsAndAssumptions[expr_] := {iExtractRootsAndAssumptions[expr]}
iExtractRootsAndAssumptions[expr_] := With[{r = Reduce`ReduceToRules[expr]},
(
{First[r], expr /. First[r]}
) /; MatchQ[r, {{__Rule}}]
];
iExtractRootsAndAssumptions[_] = $Failed;
ExtendedLimit[expr_, {x_ -> a_}, assum_] := Module[{llim, rlim},
llim = Limit[expr, x -> a, Assumptions -> assum, Direction -> 1];
rlim = Limit[expr, x -> a, Assumptions -> assum, Direction -> -1];
badTerms = ComplexInfinity|Indeterminate|Undefined|DirectedInfinity|Interval;
(
Switch[FreeQ[#, badTerms]& /@ {llim, rlim},
{True, True}, (llim + rlim)/2,
{True, False}, llim,
{False, True}, rlim,
_, Undefined
]
) /; FreeQ[{llim, rlim}, Limit]
];
ExtendedLimit[___] = $Failed;
I haven't tested this code on many examples, but here are some.
ExtendFunctionDomain[Sin[x c]/c, {x, c}]

ExtendFunctionDomain[(1 - Cos[c x])/c, {x, c}]

ExtendFunctionDomain[2 Cos[x] Sin[x] Csc[2 x], x]

FunctionExpand[x Sinc[c x]]
$\endgroup$FunctionReduce
along the lines ofTrigExpand
/TrigReduce
. :) $\endgroup$Sin[c x]/(c x)
toSinc[c x]
. One would think there should be some kind ofComplexityFunction
that could be used withFullSimplify
to achieve this. $\endgroup$Cos[z_] :> 1 - (z Sinc[z/2])^2/2
… $\endgroup$